基于udp协议的套接字通信
服务端
from socket import *
server=socket(AF_INET,SOCK_DGRAM) #数据报协议-》udp
server.bind(('127.0.0.1',8080))
data,client_addr=server.recvfrom(1) #recvfrom(1)括号内的数字1表示:b'hello'==>b'h'
print('第一次: ',client_addr,data)
data,client_addr=server.recvfrom(1024) #recvfrom(1024)括号内的数字1024表示:b'world' =>b'world'
print('第二次: ',client_addr,data)
data,client_addr=server.recvfrom(1024)
print('第三次: ',client_addr,data)
server.close()
客户端
from socket import *
client=socket(AF_INET,SOCK_DGRAM) #数据报协议-》udp
client.sendto('hello'.encode('utf-8'),('127.0.0.1',8080))
client.sendto('world'.encode('utf-8'),('127.0.0.1',8080))
client.sendto(''.encode('utf-8'),('127.0.0.1',8080))
client.close()
结果:
第一次: ('127.0.0.1', 54991) b'h'
第二次: ('127.0.0.1', 54991) b'world'
第三次: ('127.0.0.1', 54991) b''
udp并不会产生粘包问题,是由于UDP发送的时候,没有经过Negal算法优化,不会将多个小包合并一次发送出去。另外在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)
基于tcp协议的套接字通信
服务端
from socket import *
server=socket(AF_INET,SOCK_DGRAM) #数据报协议-》udp
server.bind(('127.0.0.1',8080))
while True:
data,client_addr=server.recvfrom(1024)
print('===>',data,client_addr)
server.sendto(data.upper(),client_addr)
server.close()
客户端
from socket import *
client=socket(AF_INET,SOCK_DGRAM)
while True:
msg=input('>>: ').strip()
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,server_addr=client.recvfrom(1024)
print(data)
client.close()
基于socketserver实现并发的socket(基于tcp协