为什么服务器不将消息从客户端 XY 发送到聊天中的其他客户端? - UDP 聊天应用

问题描述

我目前正在参与我的分布式系统项目。目标是编写一个聊天应用程序。不幸的是,服务器不会将消息发送给其他聊天参与者。有人能告诉我代码中的错误在哪里吗? 聊天基于UDP。

下面显示了我的服务器和客户端脚本。如果我运行这两个脚本,那么所有消息都会到达服务器。但它不执行代码server_socket.sendto(data,client)。这段代码有错吗?

服务器脚本:

import multiprocessing
import socket
import os
import time
class Server(multiprocessing.Process):
def __init__(self,server_socket,received_data,client_address):
    super(Server,self).__init__()
    self.server_socket = server_socket
    self.received_data = received_data
    self.client_address = client_address

# Override run method
def run(self):
    # Message to be sent to client
    message = 'Hi ' + self.client_address[0] + ':' + str(self.client_address[1]) + '. This is server ' + str(os.getpid())
    # Send message to client
    self.server_socket.sendto(str.encode(message),self.client_address)
    print('Sent to client: ',message)
if __name__ == "__main__":
#create clients list
clients = []
# Create a UDP socket
server_socket = socket.socket(socket.AF_INET,socket.soCK_DGRAM)

# Server application IP address and port
server_address = '127.0.0.1'
server_port = 10001


# Buffer size
buffer_size = 1024

# Bind socket to address and port
server_socket.bind((server_address,server_port))
print('Server up and running at {}:{}'.format(server_address,server_port))

while True:
    # Receive message from client
    data,address = server_socket.recvfrom(buffer_size)
    print (time.ctime(time.time()) + str(address) + ": :" + str(data))
    #print('Received message \'{}\' at {}:{}'.format(data.decode(),address[0],address[1]))
    if address not in clients:
        clients.append(address)
        #print (clients)
    for client in clients:            
        if client!=address:
            server_socket.sendto(data,client)
            
    print (time.ctime(time.time()) + str(address) + ": :" + str(data))
    

    # Create a server process
    p = Server(server_socket,data,address)
    p.start()
    p.join() 

客户端脚本:

import socket
import multiprocessing
import os
import time

buffer_size = 1024

shutdown = False   
def receive_message(server_address,server_port): 
while not shutdown:
    try:
        while True:
            data,addr = client_socket.recvfrom(buffer_size)
            print ('Received message: ',data.decode())
    except:
        pass

if __name__ == '__main__': 
# Server application IP address and port
server_address = '127.0.0.1'
server_port = 10001

# Create a UDP socket
client_socket = socket.socket(socket.AF_INET,socket.soCK_DGRAM)

# Message sent to server
message = 'Hi from ' + str(os.getpid()) + ' at ' + server_address + ':' + str(server_port)

# Send data
client_socket.sendto(str.encode(message),(server_address,server_port))
print('Sent to server: ',message)

# Receive response from server
print('Waiting for response...')
data,address = client_socket.recvfrom(buffer_size)
print('Received message: ',data.decode())

for i in range(5):
    multiprocessing.Process(target=receive_message,args=("RecvThread",client_socket)).start()
   
alias = input("Name: ")

message = (alias + ": ")
while message != 'quit':
    if message != '':
        client_socket.sendto((alias + ': ' + message).encode(),server_port)) 
    message = input(alias + ": ")          
    time.sleep(0.1)        
shutdown = True
client_socket.close()
print ('Socket close')

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)