簡體   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