UDP编程与Socket
- 相关测试命令
- windows查找udp是否启动端口:
netstart -anp udp | find "9999"
netstart -anbp udp | findstr 9999
- linux下发给服务端数据
echo "123abc" | nc -u 172.0.0.1 9999
- windows查找udp是否启动端口:
UDP服务端编程
- UDP服务端编程流程
- 创建socket对象。socket.SOCK_DGRAM
- 绑定IP和Port,bind()方法
- 传输数据
- 接收数据,socket.recvfrom(bufsize[,flags]),获得一个二元组(string,address)
- 发送数据,socket.sendto(string,address)发给某地址某信息
- 释放资源
import logging
import sys
import socket
logging.basicConfig(format="%(asctime)s %(threadName)s %(thread)d %(message)s",stream=sys.stdout,level=logging.INFO)
server = socket.socket(type=socket.SOCK_DGRAM) #创建一个基于UDP的socket
server.bind(("127.0.0.1",3999)) #立即绑定一个udp端口
# data = server.recv(1024) #阻塞等待数据
data,radde = server.recvfrom(1024) #阻塞等待数据(value,(ip,port))
logging.info("{}-{}".format(radde,data))
server.sendto("{} server msg = {}".format(server.getsockname(),data).encode(),radde)
server.close()
-
UDP客户端编写流程
- 创建socket对象。socket.SOCK_DGRAM
- 发送数据,socket_sendto(string,address)发给某地址信息
- 接收数据,socket.recvfrom(bufsize[,flags]),获得一个二元组(string,address)
- 释放资源
-
第一个版本
import logging
import sys
import socket
logging.basicConfig(format="%(asctime)s %(threadName)s %(thread)d %(message)s",stream=sys.stdout,level=logging.INFO)
client = socket.socket(type=socket.SOCK_DGRAM)
raddr = "127.0.0.1",3999
client.connect(raddr) #connect方法会自动分配一个本地的UDP地址,和设置UDP的链接对象raddr地址
logging.info(client)
client.send(b"hello") #由于使用了connect方法,所以不指定终端也能发送
client.sendto(b"why",raddr) #也可以使用指定地址发送
data,radde = client.recvfrom(1024)
logging.info("{}-{}".for