此问题已编辑为专注于更简单的问题
所以我有一个基本的客户端 - 服务器套接字安装,客户端在其中发送类似{'id': '1', 'value': 'A'}
的JSON。在服务器端,如果我收到包含id 2
的邮件,我想通过id 1
向客户发送邮件,告诉他新的value
为C
。< / p>
此消息应为&#34;私有&#34;,即只有id 1
才能接收,不允许广播。
我该如何处理这个问题?我如何跟踪服务器端的连接,以便我可以向确定的客户端发送消息?问题在于服务器是向客户端发送消息的服务器,而不响应客户端的消息。我想它必须与线程和队列的某种组合,但仍然没有找到如何做到这一点。
这是我现在在服务器上使用的代码,使用dict跟踪客户端,但它不起作用(sendall('C')
行的文件描述符错误:
track_clients = {}
while True:
print "waiting for a connection"
connection, client_address = sock.accept()
try:
print "connection from ", client_address
data = json.loads(connection.recv(1024))
track_clients[data['id']] = connection
if data['id'] == '2':
conn = track_clients['1']
conn.sendall('C')
connection.sendall(json.dumps(data))
finally:
connection.close()
答案 0 :(得分:1)
答案 1 :(得分:0)
您是否考虑过使用zeromq执行此任务? 它易于使用,并提供常见模式的高级实现。
ZeroMQ(也称为ØMQ,0MQ或zmq)看起来像一个嵌入式 网络库,但就像一个并发框架。它给你 在各种传输中携带原子消息的套接字 进程内,进程间,TCP和多播。您可以连接套接字 N-to-N具有扇出,发布子,任务分配等模式 请求 - 应答。它足够快,可以成为集群的结构 产品。其异步I / O模型为您提供可扩展的多核 应用程序,构建为异步消息处理任务。它有一个 语言API的得分,并在大多数操作系统上运行。 ZeroMQ是 来自iMatix并且是LGPLv3开源。
同样,重用现有库似乎更好,因为您可以直接关注您的任务,而库为您提供所有必需的高级方法。
答案 2 :(得分:0)
上面的代码没问题。问题是finally语句中的connection.close()。删除它,修复问题。