问题描述
我正在从客户端1和客户端2到服务器连接到客户端2。我正在将帧从客户端1发送到客户端2,然后在客户端2上进行预测并将结果发送到服务器。我有以下代码。
Client-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(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)
Client-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)).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,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()
a)while True:
代码块创建了多达Context()
个实例,这些实例具有所有分配和至少1-I / O线程,是循环运行的次数
b)循环的尾部为 footage_socket
分配了一个新对象(socket
类的另一个新实例),从而将原始对象引用呈现给 SUB
类型的套接字实例是一个孤立实例,但所有关联资源的分配均未终止
c)一个新重新分配的 footage_socket
套接字,现在带有 PUB
类型socket
的引用如实例所示,-instance确实无法处理 .send()
方法,如while True:
代码块开头的脚本所示,并且抛出了(未处理的)异常以上。
解决方案?
消除这些概念性错误-避免使预期的SUB
和新的PUB
的名称冲突,并避免重复使代码(无限地)生成新的和新的Context()
-实例(这些操作在资源和延迟方面都是昂贵的),并且它的无数socket(PUB)
-实例和无数.connect()
-s以及代码应按预期工作。
您想阅读更多有关ZeroMQ的帮助吗?
然后随时阅读this answer。