要求:使用多线程完成一个全双工的类QQ聊天程序
关键字:多线程、socket、端口绑定、消息接收与发送
Author: Huchengdong
Time: April 23 2018
-----------------------------------------------------------------BEGIN----------------------------------------------------------------------------
from socket import * # 导入socket
from threading import Thread # 导入多线程threading的Thread模块
#1、接收数据,然后打印
def recvData():
recvInfo = udpSocket.recvfrom(1024) #每次接收数据的最大字节数为1024
print(">>%s:%s"%(str(recvInfo[1],recvInfo[0]))) #打印数据信息
2、检测键盘,发送数据
def sendData():
sendInfo = input("<<")
udpSocket.sendto(sendInfo.encode("utf-8"),(ip,port))
udpSocket = None # udpSocket为对象,初试化为None
destIp = "" #字符串对象,初始化为空字符串
destPort = 0 # 数字对象,初始化为0
def main()
# 改变成全局变量,让其他函数recvData()、sendData()调用
global udpSocket
global destIp
global destPort
destIp = input("Your ip:")
destPort = int(input("Your port:"))
udpSocket = socket(AF_INET, SOCK_DGRAM) # 创建一个socket套接字
udpSocket.bind(("",4567)) # IP地址和端口号:IP默认一般不写,系统自动分配;然后,为本地进程绑定一个端口号"4567"
tr = Thread(target = recvData) # 线程1:父线程调用子线程recvData对象
ts = Thread(target = sendData) # 线程2:父线程调用子线程sendData对象
tr.start() # 启动tr线程
ts.start() # 启动ts线程
tr.join() # 父线程等待tr子线程执行结束
ts.join() # 父线程等待ts子线程执行结束
if __name__=="__main__"
main() # 调用函数main()
----------------------------------------------------END------------------------------------------------------