python网络编程(通过tcp或者udp协议通信)(代码片段)

yangzhaon yangzhaon     2022-12-07     257

关键词:

1、基于tcp协议传送文件:

  客户端:

import socket
import os
import json
import struct
client = socket.socket()
client.connect((‘127.0.0.1‘,8080))

# 文件大小
file_size = os.path.getsize(r‘F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4‘)

# 文件名字
file_name = ‘TCP发送大文件.mp4‘
# 定义一个字典
d =
‘file_name‘:file_name,
‘file_size‘:file_size

data_pytes = json.dumps(d).encode(‘utf-8‘)
# 制作报头
header = struct.pack(‘i‘,len(data_pytes))
# 发送报文
client.send(header)
# 发送字典
client.send(data_pytes)
# 发送真实数据
with open(r‘F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4‘,‘rb‘) as f:
for lie in f:
client.send(lie)
  服务端:
import socket
import struct
import json
import os

server = socket.socket()
server.bind((‘127.0.0.1‘,8080))
server.listen(5)

while True:
conn,addr = server.accept()
while True:
try:
# 接收报头
header = conn.recv(4)
# 解析报头,获取长度
header_len = struct.unpack(‘i‘,header)[0]
print(‘长度为‘+header_len)
# 接收字典,其中header_len显示为接收内容的长度
header_bytes = conn.recv(header_len)
header_dic = json.loads(header_bytes.decode(‘utf-8‘))
print(header_dic)
# 根据字典中的key获取对应的value
file_name = header_dic[‘file_name‘]
file_size = header_dic[‘file_size‘]
resc_size = 0
# 文件操作
with open(file_name,‘wb‘) as f:
while resc_size <file_size:
data = conn.recv(1024)
f.write(data)
resc_size += len(data)
except ConnectionRefusedError:
break
conn.close()

2、UDP协议通信(由于没有双通道,不会出现沾包、客户端中断或者服务端中断不影响、客户端可以发空内容)
  客户端:
import socket

client = socket.socket(type=socket.SOCK_DGRAM)
service_addr =(‘127.0.0.1‘,8080)
while True:
msg = input(‘输入要发送的消息:‘)
msg = ‘客户发送的消息:%s‘ % msg
client.sendto(msg.encode(‘utf-8‘),service_addr)
data,addr = client.recvfrom(1024)
print(data.decode(‘utf-8‘))
print(addr)

  服务端:
import socket

service = socket.socket(type=socket.SOCK_DGRAM)
service.bind((‘127.0.0.1‘,8080))
while True:
msg,addr = service.recvfrom(1024)
print(msg.decode(‘utf-8‘))
print(addr)
data = input(‘请输入回复消息:‘).encode(‘utf-8‘)
service.sendto(data,addr)

基于sockerServer模块下tcp和udp高并发通讯
  这里的高并发并不是真正意义上的高并发,是看起来像是同时运行的就成为并发
# 注意事项:udp在测试高并发的时候不要默认循环测试,最好使用客户端使用一些io操作,不然会出现卡死现象

1、基于tcp的sockerServer模块使用

客户端:
import socket

client = socket.socket()
client.connect((‘127.0.0.1‘,8080))
while True:
msg = input(‘请输入要发送的消息:‘).encode(‘utf-8‘)
client.send(msg)
data = client.recv(1024)
print(data.decode(‘utf-8‘))
服务端:
import socketserver
class Mybaby(socketserver.BaseRequestHandler):
def handle(self):
while True:
data = self.request.recv(1024)
print(data.decode(‘utf-8‘))
msg = input(‘请输入要发送的消息:‘).encode(‘utf-8‘)
self.request.send(msg)
if __name__ == ‘__main__‘:
server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,8080),Mybaby)
server.serve_forever()

2、基于UDP通信
客户端:
import socket
import time
client = socket.socket(type=socket.SOCK_DGRAM)
service_addr = (‘127.0.0.1‘, 8080)
while True:
client.sendto(b‘hello world‘,service_addr)
data, addr = client.recvfrom(1024)
print(data)
print(addr)
time.sleep(2)
服务端:
import socketserver

class MyBaby(socketserver.BaseRequestHandler):
def handle(self):
while True:
data,sock = self.request
print(data)
print(self.client_address)
sock.sendto(data,self.client_address)
if __name__ == ‘__main__‘:
server = socketserver.ThreadingUDPServer((‘127.0.0.1‘,8080),MyBaby)
server.serve_forever()
 
总结:

1、为什么会出现粘包现象?
  只有在tcp协议中才会出现粘包现象,因为tcp协议是流式协议
  特点是将数据量比较小且间隔时间短的数据一次性打包发送出去,本质还是因为我们不知道需要接收数据的长短。
2、怎么解决粘包?
  1、发送数据先告诉对方数据量的大小
  2、利用struct模块定制自己的消息传输协议
UDP协议:
  1、udp协议客户端允许发空内容。
  2、udp协议不会出现粘包。
  3、udp协议服务端不存在的情况下,客户端照样不会报错。
  4、udp协议支持并发。

udp协议叫数据协议,发消息接收消息都带有报头
upd的service不需要监听也不需要建立连接
在启动服务后只能被动的等待客户端发送消息过来,客户端发送消息过来的时候,带上服务端的地址,服务端回复消息的时候,也到带上客户端的地址。

 
并发编程:
多道技术的产生:
  解决cpu在执行程序,遇到io时,cpu不干活的情况
  串行:一个程序完完整整的运行完毕,才能运行下一个程序。
  并发:看上去像是同时运行。
多道技术:
  空间上的复用(多个程序共用一套硬件设别,它是多道技术实现时间上的复用的基础。)
  时间上的复用(单个cpu的电脑上,起多个应用程序,cpu快速切换,给人的感觉是同时运行)
  一个任务占用cpu时间过长或被操作系统强行剥夺走cpu的执行权限(比起串行效率而降低)
  一个任务执行过程中遇到io操作(等待时间),也会被操作系统强行剥夺cpu的执行权限(比串行效率高)

java网络编程udp协议

网络编程TCP/IP协议:多台计算机网络连接的规则包括:TCP协议、IP协议、UDP协议和其它协议的协议组层次结构:链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动... 查看详情

网络编程socket网络编程(代码片段)

微信公众号:菜鸟永恒第14天网络编程今日内容介绍?网络通信协议?UDP通信?TCP通信今日学习目标?能够辨别UDP和TCP协议特点?能够说出UDP协议下两个常用类名称?能够说出TCP协议下两个常用类名称?能够编写UDP协议下字符串数据传输程... 查看详情

深入浅出tcp与udp协议

深入浅出TCP与UDP协议网络协议是每个前端工程师的必修课,TCP/IP协议族是一系列网络协议的总和,而其中两个具有代表性的传输层协议,分别是TCP与UDP,本文将介绍这两者以及他们之间的区别。一、TCP/IP网络结构模型计算机与网... 查看详情

socket与tcp,udp有啥关系?

...两种根本不同的东西。语言表达的例子:用SOCKET实现TCP(或者UDP)通信。(相反,TCP或者UDP通信也可以不使用SOCKET实现)参考技术ASOCKET是TCP、UDP的实现方式,用SOCKET编程可以实现TCP、UDP的通信。 参考技术Bsocket就像一个管子,连接两... 查看详情

网络编程socket模块tcp协议udp协议

网络基础相关知识,socket模块,tcp协议通信代码网络基础相关知识(1)架构C/S架构:client客户端和server服务器端优势:能充分发挥pc机的性能B/S架构:browser浏览器和server服务器隶属于C/S架构B/S架构同意了应用的接口(2)通信同意台电脑上两... 查看详情

javase——网络编程(udp/tcp)(代码片段)

网络编程入门 网络编程概述计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的... 查看详情

android网络编程(代码片段)

传输层协议与应用层协议传输层协议-TCP特性:①.面向连接三次握手,四次挥手连接过程第一次握手通信方---->发送SYN报文--通信线路(网络)-->服务方接受报文第二次握手服务方返回---->SYN_ACK应答报文----->通信方接受第三次... 查看详情

android网络编程(代码片段)

传输层协议与应用层协议传输层协议-TCP特性:①.面向连接三次握手,四次挥手连接过程第一次握手通信方---->发送SYN报文--通信线路(网络)-->服务方接受报文第二次握手服务方返回---->SYN_ACK应答报文----->通信方接受第三次... 查看详情

python网络并发编程之tcp,udp基本语法

TCP/UDP协议:TCP(TransmissionControlProtocol)一种面向连接的、可靠的、传输层通信协议(比如:打电话)优点:可靠,稳定,传输完整稳定,不限制数据大小缺点:慢,效率低,占用系统资源高,一发一收都需要对方确认应用:Web浏览器,电子... 查看详情

网络通信协议:tcp(三次握手四次挥手)和udp(代码片段)

通信要素2:网络协议 网络通信协议计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。问题:网络协议太复杂计算机网络通信涉及内容很多,比... 查看详情

unity网络通信(tcp&udp)(代码片段)

...y/C#要想和其他电脑或者软件程序通讯,最好的方式是通过网络进行通讯,下面简要介绍以下其原理和实现:文章目录TCP和UDPTCPUnity简单实现TCP服务端TCP客户端UDPUnity简单实现UDP服务端UDP客户端TCP和UDPTCP和UDP是传输层协... 查看详情

python网络编程--tcp/ip

参考技术A首先放出一个TCP/IP的程序,这里是单线程服务器与客户端,在多线程一节会放上多线程的TCP/IP服务程序。这里将服务端和客户端放到同一个程序当中,方便对比服务端与客户端的不同。TCP/IP是因特网的通信协议,其参... 查看详情

udp-tcp

一.网络相关基本概念 1.网络通信协议:是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络引提供通信支持,是一种网络通用语言.通信协议的具体种类有很多,主要有:UDP协议和T CP协议 2.UDP协议:是UserDatagramPr... 查看详情

udp协议----简单的cs模型实现

UDP简单介绍  传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但UDP也是网络通信中不可或缺的重要通信手段。  相... 查看详情

python之socket编程(tcp/udp)

参考技术Asocket(family,type[,protocal])使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。有效的端口号:0~65535但是小于1024的端口号基本上都预留给了操作系统POSIX兼容系统(如Linux、MacOSX等),在/etc/services文件中... 查看详情

初识socket通信:基于tcp和udp协议学习网络编程

学习笔记:1.基于TCP协议的Socket网络编程:  (1)Socket类构造方法:在客户端和服务器端建立连接    Sockets=newSocket(hostName,port);以主机名和端口号作为参数来创建一个Socket对象。    Sockets=newSocket(address,port);以InetAddres... 查看详情

网络通信时选择基于tcp/ip协议还是udp/ip协议?

一般是TCP协议,可以确保传输的安全性,会帮你解决乱序重传的问题。UDP主要用来传一些辅助性的、不重要、不怕丢失的信息,以提供传输性能。参考技术A网络通信时选择基于TCP/IP协议还是UDP/IP协议/两个都有,TCP是面向连接的... 查看详情

udp-tcp

一.网络相关基本概念    1.网络通信协议:是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络引提供通信支持,是一种网络通用语言.通信协议的具体种类有很多,主要有:UDP协议和T  &nbs... 查看详情