首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接以打开openzmq中现有tcp连接中的另一个tcp连接

无法连接以打开openzmq中现有tcp连接中的另一个tcp连接
EN

Stack Overflow用户
提问于 2020-11-06 00:08:39
回答 1查看 84关注 0票数 1

我从client-1连接到client-2,从client-2连接到服务器。我从client-1向client-2发送帧,在client-2上执行预测并将结果发送到服务器。我有以下代码。

客户端1代码:

代码语言:javascript
复制
  context = zmq.Context()
  footage_socket = context.socket(zmq.PUB)
  footage_socket.connect('tcp://172.168.1.2:5555')
  videoFile = 'data.mp4'
  camera = cv2.VideoCapture(videoFile) 
  length=int(camera.get(cv2.CAP_PROP_FRAME_COUNT))
  print(length)
  count=0
  #time.sleep(2)
  while True:        
    grabbed, frame = camera.read()
    count+=1
    print(count)
    try:
       frame = cv2.resize(frame, (224, 224))
    except cv2.error:
        break
    encoded, buffer = cv2.imencode('.jpg', frame)
    jpg_as_text = base64.b64encode(buffer)
    footage_socket.send(jpg_as_text)

客户端2代码:

代码语言:javascript
复制
context = zmq.Context()
footage_socket = context.socket(zmq.SUB)
footage_socket.bind('tcp://0.0.0.0:5555')
footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))
while True:    
    frame = footage_socket.recv_string()
    img = base64.b64decode(frame)
    npimg = np.fromstring(img, dtype=np.uint8)
    source = cv2.imdecode( npimg, 1 )
    frame=cv2.resize(source,(224,224)).astype("float32")
    image = img_to_array( source)
    image = image.reshape( (1, image.shape[0], image.shape[1], image.shape[2]) )
    image = preprocess_input( image )
    preds = model.predict(image)
    ##connecting to server##        
    context1=zmq.Context()
    footage_socket=context1.socket(zmq.PUB)
    footage_socket.connect('tcp://192.168.56.103:9999')
    footage_socket.send(preds)
    print('sending to server')

服务器代码:

代码语言:javascript
复制
   context = zmq.Context()
   footage_socket = context.socket(zmq.SUB)
   footage_socket.bind('tcp://0.0.0.0:9999')
   footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))
   while True:
      frame = footage_socket.recv_string()
      img = base64.b64decode(frame)
      #print(img)

在client-2上,我收到以下错误

代码语言:javascript
复制
    frame = footage_socket.recv_string()
  File "/usr/local/lib/python3.5/dist-packages/zmq/sugar/socket.py", line 583, in recv_string
    msg = self.recv(flags=flags)
  File "zmq/backend/cython/socket.pyx", line 790, in zmq.backend.cython.socket.Socket.recv
  File "zmq/backend/cython/socket.pyx", line 826, in zmq.backend.cython.socket.Socket.recv
  File "zmq/backend/cython/socket.pyx", line 193, in zmq.backend.cython.socket._recv_copy
  File "zmq/backend/cython/socket.pyx", line 188, in zmq.backend.cython.socket._recv_copy
  File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Operation not supported
EN

回答 1

Stack Overflow用户

发布于 2020-11-06 05:08:32

几宗罪,让我们一个接一个地揭开面纱:

Client-1可以改进,但是Client-2存在大多数问题:

代码语言:javascript
复制
################################################################### FOOTAGE ~ <SUB>-Socket
# SUB
footage_socket = context.socket( zmq.SUB )
...
PUB_TARGET = 'tcp://192.168.56.103:9999'
while True:    
    frame  = footage_socket.recv_string()                         # <SUB>.recv()-ed
    source = cv2.imdecode( np.fromstring( base64.b64decode( frame ),
                                          dtype = np.uint8
                                          ),
                           1 )
    frame  = cv2.resize( source,
                         (224,224)
                         ).astype( "float32" )
    image = img_to_array( source )
    image = image.reshape( ( 1,
                             image.shape[0],
                             image.shape[1],
                             image.shape[2]
                             )
                           )
    preds = model.predict( preprocess_input( image ) )
    ################################################################## PER-LOOP INFty-times
    ## connecting to server ###########################
    context1=zmq.Context()                           ## INSTANTIATED new Context()-instance
    footage_socket = context1.socket( zmq.PUB )      ## ASSOCIATED a new  Socket()-instance
    footage_socket.connect( PUB_TARGET )             ## .CONNECT( PUB_TARGET )
    footage_socket.send( preds )                     ## <PUB>.send()
    ################################################### LOOP AGAIN
    ###################################################      yet now the <PUB>.recv()

a) while True:代码块创建尽可能多的代码块,具有所有分配和至少1个I/O线程,以及循环运行的次数

b)循环的末尾部分为footage_socket分配一个新对象(套接字的另一个新实例),将原始对象-对SUB-type socket实例的引用-呈现为一个孤立实例,但所有相关资源的分配都未终止

c)新重新分配的代码现在具有PUB-type代码块的引用,它确实不能处理在while True:-socket--instance头中编写的代码,并且会抛出(未处理的)异常,如上所述。

解决方案?

删除这些概念性错误-避免目标SUB和新PUB的名称冲突,并避免使代码重复生成新的、新的和新的Context()-instances (这些操作在资源方面和延迟方面都很昂贵)及其无限多的socket(PUB)-instances和无限多的.connect()-s -否则代码将按预期工作。

您想阅读有关ZeroMQ的更多帮助吗?

然后请随意阅读this answer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64700955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档