UDP Python:如何使服务器广播客户端在UDP聊天室中发送的消息
我正在使用UDP套接字用Python制作一个小型聊天室应用程序。我已经将其设置为用户选择用户名然后向服务器发送消息的位置。然后,服务器将向连接的每个客户端广播消息。我设法让服务器工作,客户端能够向服务器发送消息。问题是服务器没有向连接的其他客户端广播消息 以下是服务器代码:UDP Python:如何使服务器广播客户端在UDP聊天室中发送的消息,python,python-3.x,sockets,udp,Python,Python 3.x,Sockets,Udp,我正在使用UDP套接字用Python制作一个小型聊天室应用程序。我已经将其设置为用户选择用户名然后向服务器发送消息的位置。然后,服务器将向连接的每个客户端广播消息。我设法让服务器工作,客户端能够向服务器发送消息。问题是服务器没有向连接的其他客户端广播消息 以下是服务器代码: from socket import * import socket port = 1234 localhost='127.0.0.1' #Create a socket try
from socket import *
import socket
port = 1234
localhost='127.0.0.1'
#Create a socket
try :
s = socket.socket(AF_INET, SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
print ('Socket created')
except socket.error:
print ('Error creating socket.')
sys.exit()
#Bind the socket to port and localhost.
try:
s.bind((localhost, port))
except socket.error:
print ('Error while binding.')
sys.exit()
print ('Bind complete.')
while 1:
# receive data from client (data, addr)
d = s.recvfrom(2048)
data = d[0]
addr = d[1]
if not data:
break
print('Client connected at ' + addr[0] + ':' + str(addr[1]))
print('Message[' + addr[0] + ':' + str(addr[1]) + '] - ' +
data.strip().decode("utf-8"))
s.close()
客户端代码:
from socket import *
import socket
import sys
port=1234
localhost='127.0.0.1'
try:
s = socket.socket(AF_INET, SOCK_DGRAM)
except socket.error:
print ('Error creating socket.')
sys.exit()
print ("Connected to chat")
Username= input('Please choose a username: ')
while(1) :
msg = input ('Enter message to send : ')
try :
#Set the whole string
s.sendto('{}: {}'.format(Username,msg).encode('utf-8'), (localhost,port))
# receive data from server (data, addr)
data = s.recvfrom(2048)
reply = data[0]
addr = data[1]
print ( + reply.decode())
except socket.error:
print ('Error sending message ' )
sys.exit()
有什么建议吗?我想你不知道什么是
套接字。广播也是这样做的。它不会将所有接收到的消息广播到所有客户端。它用于让机器上的网络堆栈知道套接字可用于发送广播数据包(我指的是目标地址被视为“广播地址”的数据包)-这包括子网的网络和广播地址,例如子网的192.168.0.0
或192.168.0.255
要使聊天应用程序按您的意愿工作,您需要保留所有已连接客户端的日志,然后无论何时收到消息,您都可以使用s.sendto()
将其重新发送给所有客户端。嘿,伙计,您真的应该为此使用asyncio:
(49分钟)
但您需要做的是创建一个用户对象,然后向他们发送数据
此外,您似乎没有对数据进行任何清理:长度和内容应该受到限制。基本上:
from html import escape
clients = {}
...
msg = escape(msg_received[:2048])
for c in clients:
c.send(msg)