Python 3 udp套接字
TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议
使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达并不清楚。
虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议
基于UDP的套接字 udp是无链接的,先启动哪一端都不会报错
udp服务端
ss = socket() #创建一个服务器的套接字
ss.bind() #绑定服务器套接字
inf_loop: #服务器无限循环
cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
ss.close() # 关闭服务器套接字
udp客户端
cs = socket() # 创建客户套接字
comm_loop: # 通讯循环
cs.sendto()/cs.recvfrom() # 对话(发送/接收)
cs.close() # 关闭客户套接字
udp套接字简单示例
from socket import * udp_server=socket(AF_INET,SOCK_DGRAM) udp_server.bind(('127.0.0.1',8080)) while True: data,client_addr=udp_server.recvfrom(1024) print(data,client_addr) udp_server.sendto(data.upper(),client_addr)
from socket import * udp_client=socket(AF_INET,SOCK_DGRAM) while True: msg=input('>>: ').strip() udp_client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) data,server_addr=udp_client.recvfrom(1024) print(data.decode('utf-8'))
基于udp套接字不会粘包
from socket import * udp_server=socket(AF_INET,SOCK_DGRAM) udp_server.bind(('127.0.0.1',8080)) data1,client_addr=udp_server.recvfrom(1) # windows 系统会报异常 linux 系统不会报异常 print('data1',data1) data2,client_addr=udp_server.recvfrom(1024) print('data2',data2)
from socket import * udp_client=socket(AF_INET,SOCK_DGRAM) udp_client.sendto('hello'.encode('utf-8'),('127.0.0.1',8080)) udp_client.sendto('world'.encode('utf-8'),('127.0.0.1',8080))
udp套接字的并发
import socketserver class MyUDPhandler(socketserver.BaseRequestHandler): def handle(self): print(self.request) self.request[1].sendto(self.request[0].upper(),self.client_address) if __name__ == '__main__': s=socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUDPhandler) s.serve_forever()
from socket import * udp_client=socket(AF_INET,SOCK_DGRAM) while True: msg=input('>>: ').strip() udp_client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) data,server_addr=udp_client.recvfrom(1024) print(data.decode('utf-8'))