【问题标题】:Client-Server socket setup, how to respond to a determined client客户端-服务器套接字设置,如何响应确定的客户端
【发布时间】:2016-02-06 12:05:45
【问题描述】:

这个问题已经过编辑,专注于一个更简单的问题

所以我有一个基本的客户端-服务器套接字安装,其中客户端发送一个像{'id': '1', 'value': 'A'} 这样的 JSON。在服务器端,如果我收到一条带有id 2 的消息,我想用id 1 向客户端发送一条消息,告诉他他的新valueC

此消息应该是“私人的”,即只有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()

【问题讨论】:

    标签: python sockets server


    【解决方案1】:

    【讨论】:

    • 我对 Django 不感兴趣。生产服务器是 Tornado,但这甚至不是我现在关心的问题。这个问题的重点是通过套接字进行简单的客户端-服务器
    • 啊,我说的是看看他们是如何实现你所要求的。可能是github.com/andrewgodwin/channels/blob/master/channels/… 之类的东西?
    【解决方案2】:

    您是否考虑过使用zeromq 来完成这项任务? 它易于使用并提供常见模式的高级实现。

    来自zeromq guide

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        相关资源
        最近更新 更多