Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythonsocket.sendto()永远挂起_Python_Sockets - Fatal编程技术网

pythonsocket.sendto()永远挂起

pythonsocket.sendto()永远挂起,python,sockets,Python,Sockets,我正在使用服务器进行游戏,但它似乎工作不正常。这是关于服务器发送给(接收)客户机的数据,基本上是该过程的最后一步。我认为这条线是问题的根源: sock.sendto(json.dumps({player_identifier: message}), self.udp_addr) 它似乎不确定地挂起,“发送”从未打印,但“发送”是。客户端的“接收数据”也不会打印。客户端套接字绑定到端口1235上的0.0.0.0,数据从服务器发送到客户端ip地址,在本例中,端口1235上的地址为127.0.0.1

我正在使用服务器进行游戏,但它似乎工作不正常。这是关于服务器发送给(接收)客户机的数据,基本上是该过程的最后一步。我认为这条线是问题的根源:

sock.sendto(json.dumps({player_identifier: message}), self.udp_addr)
它似乎不确定地挂起,“发送”从未打印,但“发送”是。客户端的“接收数据”也不会打印。客户端套接字绑定到端口1235上的0.0.0.0,数据从服务器发送到客户端ip地址,在本例中,端口1235上的地址为127.0.0.1。当到达发送udp函数时,消息是完全完整的。我通过打印检查了所有这些。客户端的run函数也被正确执行。我找不到任何有用的信息来说明是什么导致了这个问题,但我想它一定在某一点上起了作用。你为什么不在这里工作?(如果需要,您可以在github页面的client.py和player.py中找到服务器(也可以是server.py)的其余代码)

服务器:

def send_udp(self, player_identifier, message):
    """
    Send udp packet to player (game logic interaction)
    """
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print("sending", flush = True)
    sock.sendto(json.dumps({player_identifier: message}), self.udp_addr)
    print("sent", flush = True)
客户:

class Client:
    def __init__(self,
                 server_host,
                 server_port_tcp=1234,
                 server_port_udp=1234,
                 client_port_udp=1235):
        """
        Create a game server client
        """
        self.client_udp = ("0.0.0.0", client_port_udp)
        self.lock = threading.Lock()
        self.server_listener = SocketThread(self.client_udp,
                                            self,
                                            self.lock)
        self.server_listener.start()
        self.server_udp = (server_host, server_port_udp)
        self.server_tcp = (server_host, server_port_tcp)
    
        self.register()
    
 class SocketThread(threading.Thread):
        def __init__(self, addr, client, lock):
            """
            Client udp connection
            """
            threading.Thread.__init__(self)
            self.client = client
            self.lock = lock
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            self.sock.bind(addr)
    
        def run(self):
            """
            Get responses from server
            """
            while True:
                data, addr = self.sock.recvfrom(1024)
                print("data received")
                self.lock.acquire()
                try:
                    self.client.server_message.append(data)
                finally:
                    self.lock.release()

消息有多大?UDP数据包的大小是有限制的(尽管如果超过这个限制,我希望会出现错误消息,而不是挂起)。@jasonharper,不是很大,目前以{'name':'John D.,'message':“我只是John Doe…”为例,它不起作用。它也首先通过其他套接字发送,所以这可能不是问题所在。也许json.dumps()不会返回?@Jeremy Friesner打印json.dumps()输出{“92e4649e-144d-4e01-b272-ded85053dcd7:{“name”:“John Doe”,“message”:“我只是John Doe…”}。我想哪个是对的?你改变了这里的哲学。在git代码中,服务器只接收UDP;所有输出数据都通过TCP传输。这有什么原因吗?