python3 socket 点对点可视化通信_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)#用户注册用户名

if talkName not in talkPair.keys():

talkPair[talkName]=addr#字典关联socket

sRes="welcome %s "%talkName

udpS.sendto(sRes.encode(),addr)

else:

sRes="The name exsit"

udpS.sendto(sRes.encode(),addr)

else:#判断是否是发给某个人的

talkName=re.match("^T:(\w+):",srcData)

print(talkName)

if talkName:

talkName=talkName.group(1)

if talkName:#判断发给某个人的姓名是否存在

if talkName in talkPair.keys():#查找socket通信

udpS.sendto(srcData.encode(),talkPair[talkName])

else:#发给某人的不存在提示用户不存在

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)#匹配通信的用户名

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我可以回答这个问题。以下是一个使用Pyside2和socket实现一个服务器与多个客户端通信Python代码的示例: ```python import sys from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * import socket import threading class Server(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('Server') self.setGeometry(100, 100, 400, 300) self.textbox = QTextEdit(self) self.textbox.setReadOnly(True) self.textbox.setGeometry(10, 10, 380, 200) self.start_button = QPushButton('Start', self) self.start_button.setGeometry(10, 220, 80, 30) self.start_button.clicked.connect(self.start_server) self.stop_button = QPushButton('Stop', self) self.stop_button.setGeometry(100, 220, 80, 30) self.stop_button.clicked.connect(self.stop_server) self.show() def start_server(self): self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.bind(('localhost', 12345)) self.server_socket.listen(5) self.textbox.append('Server started.') self.clients = [] self.running = True self.accept_thread = threading.Thread(target=self.accept_clients) self.accept_thread.start() def stop_server(self): self.running = False self.server_socket.close() self.textbox.append('Server stopped.') def accept_clients(self): while self.running: client_socket, address = self.server_socket.accept() self.clients.append(client_socket) self.textbox.append('Client connected: ' + str(address)) client_thread = threading.Thread(target=self.handle_client, args=(client_socket,)) client_thread.start() def handle_client(self, client_socket): while self.running: try: data = client_socket.recv(1024) if data: self.textbox.append('Received from client: ' + data.decode()) for client in self.clients: if client != client_socket: client.send(data) else: self.clients.remove(client_socket) self.textbox.append('Client disconnected.') break except: self.clients.remove(client_socket) self.textbox.append('Client disconnected.') break if __name__ == '__main__': app = QApplication(sys.argv) server = Server() sys.exit(app.exec_()) ``` 这个代码实现了一个基于Pyside2和socket的服务器,可以与多个客户端进行通信。当客户端连接到服务器时,服务器会将其加入客户端列表,并启动一个新的线程来处理该客户端的消息。当客户端发送消息时,服务器会将该消息广播给所有客户端。当客户端断开连接时,服务器会将其从客户端列表中移除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值