Python3 UDP 多个客户端互相通信

1.问题

实现多个客户端能够使用UDP协议互相发送消息

2.解决想法

创建一个UDP服务器接收连接的UDP客户端,并把要发送的消息转发到队友的客户端主机上

3.实现代码

3.1 服务端代码

from socket import *
from time import ctime
import re
HOST=''
PORT=21567
BUFSIZE=1024
ADDR=(HOST,PORT)
udpS=socket(AF_INET,SOCK_DGRAM)
udpS.bind(ADDR)
talkPair={}
print("waiting...............")
while True:
    data,addr=udpS.recvfrom(BUFSIZE)
    srcData=data.decode()
    talkName=re.match("^U:(\w+):$",srcData)
    if talkName:
        talkName=talkName.group(1)
        print(talkName)#regist the user name
        if talkName not in talkPair.keys():
            talkPair[talkName]=addr# dictionary realted socket
            sRes="welcome %s "%talkName
            udpS.sendto(sRes.encode(),addr)
        else:
            sRes="The name exsit"
            udpS.sendto(sRes.encode(),addr)
    else:#check wheather for someone
        talkName=re.match("^T:(\w+):",srcData)
        print(talkName)
        if talkName:
            talkName=talkName.group(1)
            if talkName:#check the user name wheatehr existed
                if talkName in talkPair.keys():#check socket communication
                    udpS.sendto(srcData.encode(),talkPair[talkName])
                else:# give the message the user not exsited
                    sRes="No this one"
                    udpS.sendto(sRes.encode(),addr)
        else:
            sRes="Can't identify info"
            udpS.sendto(sRes.encode(),addr)
udpS.close()

3.2客户端代码

from socket import *
import threading,re
HOST='localhost'
PORT=21567
BUFSIZE=1024
ADDR=(HOST,PORT)
tC=socket(AF_INET,SOCK_DGRAM)
Tflag=True
def action(tC):
    while True:
        data,addr=tC.recvfrom(BUFSIZE)
        sRes=data.decode()
        talkName=re.match("^T:(\w):(.*)",sRes)#match the user
        if talkName:
            print(">",talkName.group(1)," say:",talkName.group(2))
        else:
            print(sRes)
t=threading.Thread(target=action,args=(tC,))
try:
    while Tflag:
        data=input(">")
        if data == '88':
            break
        tC.sendto(data.encode(),ADDR)
        if t.is_alive() is False:
            t.start()
except KeyboardInterrupt as e:
    print(e)
    tC.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值