python WebSocket连接在连接时立即关闭,没有明显的原因

a11xaf1n  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(390)

我正在写一个多人游戏包使用websockets。我在包中有一个服务器文件和一个客户机文件,并设置了两个单独的测试文件来测试包,一个是服务器,一个是客户机。
我的问题是,当运行服务器并通过客户端连接到它时,它会连接,然后立即断开连接。当查看回溯时,没有明显的原因可以解释为什么它断开连接。
回溯:

Connected
connection handler failed
Traceback (most recent call last):
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\site-packages\websockets\legacy\server.py", line 240, in handler
    await self.ws_handler(self)
  File "C:\Users\diarm\Documents\GitHub\pymultiplayer\pymultiplayer\server.py", line 16, in connection_handler
    helper_process.start()
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)
                  ^^^^^^^^^^^^^^^^^
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\context.py", line 336, in _Popen
    return Popen(process_obj)
           ^^^^^^^^^^^^^^^^^^
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\popen_spawn_win32.py", line 94, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle '_asyncio.Future' object
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\spawn.py", line 111, in spawn_main
    new_handle = reduction.duplicate(pipe_handle,
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\reduction.py", line 79, in duplicate
    return _winapi.DuplicateHandle(
           ^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [WinError 6] The handle is invalid

所有文件:https://github.com/iamdeedz/pymultiplayer/blob/backbone
我查了OSError: [WinError 6] The handle is invalidTypeError: cannot pickle '_asyncio.Future' object没有结果。我在其他地方问过这个问题,没有得到答案。我试着连接到服务器,并发送一些测试数据。
任何帮助感激不尽。

y53ybaqx

y53ybaqx1#

问题是这两行:

File "C:\Users\diarm\Documents\GitHub\pymultiplayer\pymultiplayer\server.py", line 16, in connection_handler
    helper_process.start()
  File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)

正如您已经正确识别的,错误是TypeError: cannot pickle '_asyncio.Future' object。这是因为Future属于您正在运行的主进程上的一个线程,该线程是主进程的事件循环。当你用POpen把它发送到一个新的进程时,它到这个线程的链接就被破坏了,它永远不会被更新。
在不知道代码的其余部分的情况下,很难说如何解决这个问题,但一般来说,您应该await这个asyncio.Future的结果/异常,并将其发送到子进程。如果您需要在两者之间进行持续的通信,即主进程和您创建的POpen进程,您可以查看Queue s或Pipe s,其中Queue是构建在Pipe之上的一些额外功能。

相关问题