概述
在 python之socket编程(UDP) 中,写了两个py文件来进行收发数据,这显然是不合理的,像QQ、微信等即时通信工具,都是 一个程序实现了收发
分析
本文实现一个程序进行收发,由于 接收数据 的方法会 阻塞,所以一旦执行 接收数据 方法后,程序处于无响应状态,无法接收键盘输入
难点在于:通过多线程的方式,主线程用于发数据、子线程用于接收数据
#coding=utf-8
import socket,threading
udp=None
ip=''
port=0
def recvdata():
global udp
while True:
data,addr=udp.recvfrom(1024)
print('\n来自%s:%d的消息::%s'%(addr[0],addr[1],data.decode('utf-8')))
if __name__ == "__main__":
print('欢迎使用局域网聊天工具v0.1')
localport=input('设置本机端口:')
ip=input('请输入对方ip:')
port=input('请输入对方port:')
udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp.bind(('',int(localport)))
t=threading.Thread(target=recvdata)
t.start()
while True:
text=input('请输入消息:')
udp.sendto(text.encode('utf-8'),(ip,int(port)))
执行后,按照提示绑定本地端口,远程ip地址、端口,即可发送数据
注意:
在上面的代码中,一个socket对象可以发数据,也可以接收数据,这种叫做 全双工模式,详细参见链接:
http://www.malaoshi.top/show_1EF2zlQVGg3F.html