【问题标题】:UDP Python: How to make the server broadcast messages the clients send in the UDP ChatroomUDP Python:如何使服务器广播客户端在 UDP 聊天室中发送的消息
【发布时间】:2017-09-23 03:10:51
【问题描述】:

我正在使用 UDP 套接字在 Python 中制作一个小型聊天室应用程序。我已将其设置为用户选择其用户名然后向服务器发送消息的位置。然后服务器会将消息广播到每个连接的客户端。我设法使服务器正常工作,并且客户端能够向服务器发送消息。问题是服务器没有将消息广播给其他连接的客户端。

这是服务器代码:

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

有什么建议吗?

【问题讨论】:

    标签: python python-3.x sockets udp


    【解决方案1】:

    嘿,伙计,您真的应该为此使用 asyncio: (49 分钟)https://www.youtube.com/watch?v=ZzfHjytDceU

    但是你需要做的是创建一个用户对象,然后向他们发送数据

    此外,您似乎没有对数据进行任何清理:长度和内容应该受到限制。基本上:

    from html import escape
    clients = {}
    
    ...
    
    msg = escape(msg_received[:2048])
    for c in clients:
        c.send(msg)
    

    【讨论】:

      【解决方案2】:

      我认为您对 socket.SO_BROADCAST 的作用感到困惑。它不会导致所有收到的消息都广播给所有客户端。它用于让机器上的网络堆栈知道可以使用套接字发送广播数据包(我的意思是目标地址被视为“广播地址”的数据包 - 这包括网络和子网的广播地址,例如192.168.0.0192.168.0.255 子网192.168.0.0/24)。

      要使您的聊天应用程序按您的意愿运行,您需要记录所有已连接的客户端,然后每当您收到消息时,您可以使用s.sendto() 将其重新发送给所有客户端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多