繁体   English   中英

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

[英]Client-Server socket setup, how to respond to a determined client

该问题已被编辑以关注一个简​​单的问题

因此,我有一个基本的客户端-服务器套接字安装,其中客户端发送JSON,例如{'id': '1', 'value': 'A'} 在服务器端,如果我收到id 2的消息,我想向id 1的客户端发送消息,告诉他他的新value C

此消息应为“私人”,即,只有id 1可以接收它,不允许广播。

我应该如何解决这个问题? 如何跟踪服务器端的连接,以便可以向确定的客户端发送消息? 问题是服务器是向客户端发送消息的服务器,而不是响应客户端消息的服务器。 我想它一定是线程和队列的某种组合,但是仍然没有弄清楚该怎么做。

这是我现在在服务器上的代码,使用dict跟踪客户端,但是它不起作用( sendall('C')行中的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()

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

zeromq指南

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM