在linux环境下使用 udp+多线程 模拟QQ
分析
程序主要的两个功能:
- 发送数据(Send Data)
- 接收数据(Reveive Data)
使用多线程的原因
不使用多线程的情况下,在程序暂停等待发送方输入发送内容时,若发送方不输入内容,则程序一直卡在这里;此时另外一放发送数据由于程序暂时等待输入内容也不能打印消息。
使用了多线程,接收数据、发送数据的程序分别由一个线程来处理,且两个线程互不影响,发送方不输入内容时,另一方发送消息发送方就能接收到。
Note:通信的两台计算机必须在同一个局域网!!!
Code
# coding=utf-8
# 1.receive data then print out
from threading import Thread
from socket import *
def recvData():
while True:
recvInfo = udpSocket.recvfrom(1024)
print(">>%s:%s\n<<"%(str(recvInfo[1]),recvInfo[0]),end="")
# 2.detect the keyboard and send the data
def sendData():
print("<<",end="")
while True:
sendInfo = input("")
udpSocket.sendto(sendInfo.encode('gb2312'),(destIp,destPort))
udpSocket = None
destIp = ""
destPort = 0
def main():
global udpSocket
global destIp
global destPort
destIp = input("Destination ip:")
destPort = int(input("Destination port:"))
udpSocket = socket(AF_INET,SOCK_DGRAM)
udpSocket.bind(("",4567))
tr = Thread(target=recvData)
ts = Thread(target=sendData)
tr.start()
ts.start()
tr.join()
ts.join()
if __name__ == '__main__':
main()