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传输。这有什么原因吗?