如何从UDP服务器发送UDP消息而不发送给自己?

时间:2017-02-08 08:31:57

标签: python sockets udp protocol-buffers

我想建立一个UDP服务器,在服务器从客户端收到消息后立即向UDP客户端发送消息。我使用Python和Google Protobuffer作为消息协议。

目前,消息接收部分似乎有效,但是关于消息发送部分,它有一个问题:来自服务器的响应消息没有到达客户端,更糟糕的是,服务器显示该消息(可能是发送给自己?现在,控制台显示来自客户端的消息和应发送给客户端的消息。当我在C ++或C#上尝试类似的代码时,这个问题并没有发生。

以下内容摘自我的代码:

def connect(self):
     remote = ('x.x.x.x',xxxx) #ip and port
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     self.sock.settimeout(2.5)
     self.sock.bind(remote)
     self.sock.settimeout(None)

def start(self):
    while not self.exit_thread:

        # Get the message from client
        data, address = self.sock.recvfrom(8192)

        if data is not None:

            # De-serialize inbound message from client
            msg_client = xxx_pb2.msgClient()
            msg_client.ParseFromString(data)

            # Display message from client
            self.display_inbound_message(msg_client)

            # Create a new message from server
            msg_serer = xxx_pb2.msgServer()
            self.create_outbound_message(msg_serer)

            # Send the Udp message to the client, return the number of bytes sent
            bytes_sent = self.sock.sendto(msg_server.SerializeToString(), self.remote)
            if (bytes_sent < 0):
                print("Error send message")

我没有足够的Python编程经验。如果你发现任何事情,请告诉我。

1 个答案:

答案 0 :(得分:1)

此代码的问题是服务器回复自身,而不是远程客户端。在这里:

data, address = self.sock.recvfrom(8192)
# ...
bytes_sent = self.sock.sendto(msg_server.SerializeToString(), self.remote)

应该是:

bytes_sent = self.sock.sendto(msg_server.SerializeToString(), address)

remote重命名为server_address是有道理的,因为它是此服务器的地址。