udp是无链接的,先启动哪一端都不会报错
udp不需要经过3次握手和4次挥手,不需要提前建立链接,直接发送数据即可
udp服务端
1 ss = socket() #创建一个服务器的套接字
2 ss.bind() #绑定服务器套接字 3 inf_loop: #服务器无限循环 4 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) 5 ss.close() # 关闭服务器套接字
udp客户端
cs = socket() # 创建客户套接字
comm_loop: # 通讯循环
cs.sendto()/cs.recvfrom() # 对话(发送/接收) cs.close() # 关闭客户套接字
服务端:
# import socket
from socket import * # 尽量少用这种导入方式,会将所有名字加入名称空间,容易导致重复 # server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 可以看到需要引用的socket的模块非常多。改用from socket import *导入 server = socket(AF_INET, SOCK_DGRAM) # SOCK_STREAM指的流式协议,SOCK_DGRAM指得是数据报协议(但凡发数据,就已经是完整的数据报) server.bind(('127.0.0.1', 8080)) # server.listen(5) # 挂起的链接数,TCP协议需要,UDP不需要 # while True: # conn, addr = server.accept() # 用来建立链接,UDP不需要 while True: data, client_addr = server.recvfrom(1024) # 收消息 print(data) 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, server_addr) client.close()