Python和ZeroMQ订阅服务器对发布服务器的确认

Python和ZeroMQ订阅服务器对发布服务器的确认,python,zeromq,Python,Zeromq,我正在尝试使用Python中的ZeroMQ从订阅者那里获得对发布者的确认 我尝试了几个代码示例,使用了zmq.PUSH和zmq.PULL代码序列,但没有效果 我的代码如下: PUB\u SERVER.PY import zmq import random import sys import time port = "5556" if len( sys.argv ) > 1: port = sys.argv[1] int( port ) context = zmq.C

我正在尝试使用Python中的ZeroMQ从订阅者那里获得对发布者的确认

我尝试了几个代码示例,使用了
zmq.PUSH
zmq.PULL
代码序列,但没有效果

我的代码如下:

PUB\u SERVER.PY

import zmq
import random
import sys
import time

port = "5556"
if len( sys.argv ) > 1:
   port =  sys.argv[1]
   int( port )

   context = zmq.Context()
   socket  = context.socket( zmq.PUB )
   socket.bind( "tcp://*:%s" % port )

   while True:
      # topic = random.randrange( 9999, 10005 )
      topic       = 10000
      messagedata = random.randrange( 1, 215 ) - 80
      print        "%d %d" % ( topic, messagedata )
      socket.send( "%d %d" % ( topic, messagedata ) )
      time.sleep( 1 )
import sys
import zmq

port = "5556"
if len( sys.argv ) > 1:
   port =  sys.argv[1]
   int( port )

   if len( sys.argv ) > 2:
      port1   =  sys.argv[2]
      int( port1 )

      # Socket to talk to server
      context = zmq.Context()
      socket  = context.socket( zmq.SUB )

      print "Collecting updates from weather server..."
      socket.connect( "tcp://192.168.0.21:%s" % port )

if len( sys.argv ) > 2:
   socket.connect(    "tcp://192.168.0.21:%s" % port1 )

   # Subscribe to zipcode, default is NYC, 10001
   topicfilter = "10000"
   socket.setsockopt( zmq.SUBSCRIBE, topicfilter )

   # Process 5 updates
   total_value = 0
   for update_nbr in range( 5 ):
      string = socket.recv()
      topic, messagedata = string.split()
      total_value += int( messagedata )
      print topic, messagedata

   print "Average messagedata value for topic '%s' was %dF" % ( topicfilter, total_value / update_nbr )
SUB_CLIENT.PY

import zmq
import random
import sys
import time

port = "5556"
if len( sys.argv ) > 1:
   port =  sys.argv[1]
   int( port )

   context = zmq.Context()
   socket  = context.socket( zmq.PUB )
   socket.bind( "tcp://*:%s" % port )

   while True:
      # topic = random.randrange( 9999, 10005 )
      topic       = 10000
      messagedata = random.randrange( 1, 215 ) - 80
      print        "%d %d" % ( topic, messagedata )
      socket.send( "%d %d" % ( topic, messagedata ) )
      time.sleep( 1 )
import sys
import zmq

port = "5556"
if len( sys.argv ) > 1:
   port =  sys.argv[1]
   int( port )

   if len( sys.argv ) > 2:
      port1   =  sys.argv[2]
      int( port1 )

      # Socket to talk to server
      context = zmq.Context()
      socket  = context.socket( zmq.SUB )

      print "Collecting updates from weather server..."
      socket.connect( "tcp://192.168.0.21:%s" % port )

if len( sys.argv ) > 2:
   socket.connect(    "tcp://192.168.0.21:%s" % port1 )

   # Subscribe to zipcode, default is NYC, 10001
   topicfilter = "10000"
   socket.setsockopt( zmq.SUBSCRIBE, topicfilter )

   # Process 5 updates
   total_value = 0
   for update_nbr in range( 5 ):
      string = socket.recv()
      topic, messagedata = string.split()
      total_value += int( messagedata )
      print topic, messagedata

   print "Average messagedata value for topic '%s' was %dF" % ( topicfilter, total_value / update_nbr )
该代码在一个SSH窗口(在Parallela上)中提供了服务器的输出,在另一个SSH窗口(在RaspberryPi上)中提供了客户机收到的过滤消息,这非常有效

我迷路的地方是,一旦客户机从服务器收到过滤消息,它将如何确认收到的过滤消息,然后让服务器记录这些已确认的消息

最后,我想做一些明智的决定,向确认的订阅者发送一个文件。

如何确认? 可为此目的为软信令创建并行消息传递结构

使用
.SUB
接收接入点扩展
发布服务器.PY

anAckRxSOCKET  = context.socket( zmq.SUB )               # create SUB side
anAckRxSOCKET.bind( "tcp://*:%s" % aServerAckPORT ) )    # .bind()
anAckRxSOCKET.setsockopt( zmq.SUBSCRIBE, "" )            # SUB to *-anything
# ...
anAckRxSTRING = anAckRxSOCKET.recv()                     # .recv()
anAckTxSOCKET  = context.socket( zmq.PUB )               # create PUB side(s)
anAckTxSOCKET.connect( "tcp://192.168.0.21:%s" % aServerAckPORT ) )
使用
.PUB
Tx套接字将
SUB_CLIENT.PY
扩展到服务器端访问点:

anAckRxSOCKET  = context.socket( zmq.SUB )               # create SUB side
anAckRxSOCKET.bind( "tcp://*:%s" % aServerAckPORT ) )    # .bind()
anAckRxSOCKET.setsockopt( zmq.SUBSCRIBE, "" )            # SUB to *-anything
# ...
anAckRxSTRING = anAckRxSOCKET.recv()                     # .recv()
anAckTxSOCKET  = context.socket( zmq.PUB )               # create PUB side(s)
anAckTxSOCKET.connect( "tcp://192.168.0.21:%s" % aServerAckPORT ) )
及 发送带有“a-proxy-ID”的ACK,用于您可能想要或需要的任何服务器端处理

anAckTxSOCKET.send( topicfilter )                        # ACK with an "identity"-proxy

我明天就跑!嗨,我刚刚试了一下,下面是我的结果:-来自客户端从天气服务器收集更新。。。10000-69 10000 63 10000-22 10000-64 10000 81主题“10000”的平均messagedata值为-3F-来自服务器(确认)63-22-22-64-64我的第一个数据位被截断,后面的数据位被复制。有什么想法吗?