我相信我偶然发现了OP发现的解决方案,但惨败于失败。我没有足够的评论声望,否则我会回应所有的混淆评论,要求澄清OP的回应。
简短的版本是,我认为OP指的是他服务器端的连接处理时,他说:“我所要做的就是从块返回WebSocket连接关闭之前处理程序”。
原来我的服务器自动关闭了webSocket,因为我不明白某个webSocket函数是如何工作的。具体来说,我用用ASYNCIO/WebSockets的一个Python服务器脚本和下面的代码:
async def receiveCommandsLoop(player):
while True:
msg = await player.websocket.recv()
print(command)
async def handleClient(websocket, path):
username = await websocket.recv()
player = players[username]
...
#Start task to listen for commands from player
asyncio.get_event_loop().create_task(receiveCommandsLoop(player))
start_server = websockets.serve(handleClient, '', 8765)
的想法是,websockets.serve将使用handleClient开始连接,并做一些设置,然后创建一个新的任务receiveCommandsLoop将接管通信工作。
但事实证明:当您调用websockets.serve时,Python期望当您的处理程序(在本例中为handleClient)返回时,必须使用套接字完成,并自动关闭它。
因此,运行receiveCommandsLoop时,handleClient已返回,并且webSocket已自动关闭。
我能够通过简单地修改我的handleClient函数来直接运行原来包含在receiveCommandsLoop中的循环来解决这个问题。希望这可以帮助那里的人。
这个问题可能在你的服务器代码中,你可以发布它吗? –
如果您使用'code.google.com/p/go.net/websocket',一旦处理函数退出,连接就会关闭。这是设计,不会给出任何错误。也许这可能是问题? – ANisus
我正在使用它。 有什么办法可以避免这种情况发生,或者它本身就是我们无法解决的图书馆设计的一部分? –