使用udp绑定端口用来接收数据
报一下环境:
win10 + pycharm(python3.7) + mNetAssist
就是win10从mNetAssist传数据到pycharm
话不多说,先放代码:
import socket
def main():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定一个本地信息
localaddr = ("", 7788)
udp_socket.bind(localaddr)
# 接收数据
recv_data = udp_socket.recvfrom(1024) # 1024 代表接收的最大字节数
# 打印接收到的数据
print(recv_data)
# 关闭
udp_socket.close()
if __name__ == "__main__":
main()
但是这样接收到的数据是元组类型:
(b’hahaha’, (‘192.168.1.101’, 8080))
所以需要解析一下,其实也就是把元组切片(虽然只有两片),tuple[0]是接收的数据,tuple[1] 是发送方的ip以及port
打印的时候,要以字符串类型输出,所以把 tuple[1] 用 str 强制类型转换一下, tuple[0] 用 gbk 编码格式
代码如下:
import socket
def main():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定一个本地信息
localaddr = ("", 7788)
udp_socket.bind(localaddr) # 必须绑定自己电脑的ip以及port,其他的不行
# 接受数据
recv_data = udp_socket.recvfrom(1024) # 1024 代表接收的最大字节数
# recv_data 存储的是一个元组(接收到的数据,发送方的ip, port))
recv_msg = recv_data[0] # 存储接收的数据
send_addr = recv_data[1] # 存放发送方的地址信息
# 打印接收到的数据
print("%s:%s" %(str(send_addr), recv_msg.decode("GBK")))
# 关闭
udp_socket.close()
if __name__ == "__main__":
main()
要想循环接收,加个 while True 就行,则代码如下:
import socket
def main():
# 创建一个套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定一个本地信息
localaddr = ("", 7788)
udp_socket.bind(localaddr) # 必须绑定自己电脑的ip以及port,其他的不行
# 接受数据
while True:
recv_data = udp_socket.recvfrom(1024) # 1024 代表接收的最大字节数
# recv_data 存储的是一个元组(接收到的数据,发送方的ip, port))
recv_msg = recv_data[0] # 存储接收的数据
send_addr = recv_data[1] # 存放发送方的地址信息
# 打印接收到的数据
print("%s:%s" %(str(send_addr), recv_msg.decode("GBK")))
# 关闭
udp_socket.close()
if __name__ == "__main__":
main()
注意事项
- 1.以上代码中绑定本地信息时, localaddr 并未写明具体 ipv4 地址,而只是用 “” 代替,是因为程序运行时会自动匹配上本地的已连接的 ipv4 地址,无需自己设置(自己设置也行)
- 2.并且绑定信息时必须绑定自己电脑的ip以及port,其他的不行