victory的博客

长安一片月,万户捣衣声

0%

网络编程 | udp+多线程模拟QQ

在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()

运行效果

udp