客户端 - 服务器套接字设置,如何响应已确定的客户端

时间:2016-02-06 12:05:46

标签: python sockets server

此问题已编辑为专注于更简单的问题

所以我有一个基本的客户端 - 服务器套接字安装,客户端在其中发送类似{'id': '1', 'value': 'A'}的JSON。在服务器端,如果我收到包含id 2的邮件,我想通过id 1向客户发送邮件,告诉他新的valueC。< / 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()

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

您是否考虑过使用zeromq执行此任务? 它易于使用,并提供常见模式的高级实现。

来自zeromq guide

  

ZeroMQ(也称为ØMQ,0MQ或zmq)看起来像一个嵌入式   网络库,但就像一个并发框架。它给你   在各种传输中携带原子消息的套接字   进程内,进程间,TCP和多播。您可以连接套接字   N-to-N具有扇出,发布子,任务分配等模式   请求 - 应答。它足够快,可以成为集群的结构   产品。其异步I / O模型为您提供可扩展的多核   应用程序,构建为异步消息处理任务。它有一个   语言API的得分,并在大多数操作系统上运行。 ZeroMQ是   来自iMatix并且是LGPLv3开源。

同样,重用现有库似乎更好,因为您可以直接关注您的任务,而库为您提供所有必需的高级方法。

答案 2 :(得分:0)

上面的代码没问题。问题是finally语句中的connection.close()。删除它,修复问题。