我正在学习使用 HTML5 WebSockets,作为学习的一部分,我正在用 Python 编写一个服务器,这样我就可以了解它们如何工作的细节。前几天我创建了一个效果很好的应用程序,但我想扩展它,以便它支持多个端点,每个端点都是一个不同的“服务”,可以处理 websocket 客户端。
目前,我的实现适用于生成进程等(我使用多处理而不是线程,因为我读到线程在 CPython 中并不是真正的多线程,这就是我认为我正在使用的(Ubuntu 12.04 上的默认安装)),但是我在将收到的客户端套接字发送到服务进程时遇到问题。
这是我发送它们的方式(这在循环中运行):
try:
#get a new client
conn, addr = server.accept()
print "Client connected from", addr
request = conn.recv(4096)
response, close, service = self.handshake(request)
conn.send(response)
if close:
print "Invalid request from", addr
conn.close()
continue
client = WebSockets.WebSocketClient(conn, addr)
service.clientConnQueue.put(client)
“server”是一个监听传入连接的套接字。握手方法负责验证他们的请求并确定将客户端放入哪个服务进程。 'response' 是要发送的 http 响应,'close' 如果出现错误则为 True,'service' 是继承自 multiprocessing.Queue 的类。 WebSocktes.WebSocketClient 是我的发送和接收实现的存储位置,它基本上充当套接字的包装器。
'clientConnQueue' 的创建方式如下:
class Service(multiprocessing.Process):
"""Base class for all services."""
def __init__(self, manager):
multiprocessing.Process.__init__(self)
self.manager = manager
self.clientConnQueue = self.manager.Queue()
self.shutdownFlag = multiprocessing.Event()
manager 是一个 multiprocessing.Manager()
当我尝试将客户端放入 clientConnQueue 时出现的错误如下:
File "./WebSocketServer.py", line 183, in <module>
main()
File "./WebSocketServer.py", line 180, in main
server.runServer()
File "./WebSocketServer.py", line 67, in runServer
service.clientConnQueue.put(client)
File "<string>", line 2, in put
File "/usr/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod
conn.send((self._id, methodname, args, kwds))
TypeError: expected string or Unicode object, NoneType found
然后我在接收端收到管道损坏错误。
当我使用 multiprocessing.Queue 发送连接时,我遇到了同样的错误,我认为将其更改为管理器创建的队列可以解决问题。然而,它似乎做了完全相同的实现。
显然,这不是将此类内容发送到正在运行的进程的方式,那么将不可序列化对象发送到进程的正确方法是什么?