Python 无法连接以打开openzmq中现有tcp连接中的另一个tcp连接
我正在从客户机1连接到客户机2,从客户机2连接到服务器。我将帧从客户机1发送到客户机2,在客户机2上,我执行预测并将结果发送到服务器 客户端1代码:Python 无法连接以打开openzmq中现有tcp连接中的另一个tcp连接,python,python-3.x,sockets,zeromq,pyzmq,Python,Python 3.x,Sockets,Zeromq,Pyzmq,我正在从客户机1连接到客户机2,从客户机2连接到服务器。我将帧从客户机1发送到客户机2,在客户机2上,我执行预测并将结果发送到服务器 客户端1代码: context = zmq.Context() footage_socket = context.socket(zmq.PUB) footage_socket.connect('tcp://172.168.1.2:5555') videoFile = 'data.mp4' camera = cv2.VideoCapture(vi
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代码:
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')
服务器代码:
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上,我收到以下错误
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
好几宗罪,让我们一宗接一宗地揭露: Client-1可以改进,但Client-2存在大多数问题:
################################################################### 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()
来自码码码码码码码码码码码码码方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方视频剪辑
#潜艇
taines_socket=context.socket(zmq.SUB)
...
目标酒店tcp://192.168.56.103:9999'
尽管如此:
frame=taines_socket.recv_string()#.recv()-ed
source=cv2.imdecode(np.fromstring(base64.b64解码(帧)),
dtype=np.uint8
),
1 )
frame=cv2。调整大小(源,
(224,224)
).astype(“float32”)
image=img_到_数组(源)
图像=图像。重塑((1,
image.shape[0],
image.shape[1],
图像.形状[2]
)
)
preds=模型.预测(预处理输入(图像))
##################################################################每循环输入次数
##连接到服务器###########################
context1=zmq.Context()##实例化的新Context()-实例
taines_socket=context1.socket(zmq.PUB)##关联一个新socket()-实例
连接(发布目标)###连接(发布目标)
镜头(u socket.send(preds###.send)
###################################################再次循环
###################################################但是现在.recv()
a) 为True时:
-code块创建尽可能多的Context()
-实例,具有所有分配和至少1个I/O线程,循环运行的次数相同
b) 循环的尾部为
分配一个新对象(socket-类的另一个新实例),使对
类型套接字实例的原始对象引用成为孤立对象,但所有相关资源的分配都未终止
c) 一个新重新分配的
-socket,现在带有一个
-typesocket
-实例的引用,实际上无法处理.send()
-方法,如头部所述,而True:
-代码块和(未处理)抛出异常,如上所示
解决方案 删除这些概念性错误-避免预期的
SUB
和新的PUB
的名称冲突,避免代码重复(无限)生成新的上下文()
-实例(这些操作在资源和延迟方面都很昂贵)及其无限多的套接字(PUB)
-实例及其无限多个.connect()
-s&否则代码应按预期工作
是否要阅读有关ZeroMQ的更多帮助?
然后,请随意阅读。这篇文章仍然非常贴切:(请不要将答案用于元评论。如果您对社区如何处理您的答案有任何疑问,请将其发布在元评论上。因此)。其他用户可能会提出他们自己的反馈,但我也很高兴给出一个富于说服力的解释,这是基于我迄今为止提供的各种理由。嗨,非常感谢你的帮助,@user3666197,我仍然面临同样的问题?@Mazia你是如何更改错误代码的?您是否介意发布一个新问题,并用可复制的MCVE代码演示其余问题?