当前位置: 首页 > 后端技术 > Python

socket实现从[client]向[server]发送图片和字符串消息

时间:2023-03-26 16:13:55 Python

在Python3中,socket只能以bytes格式传输信息,到达服务端会返回原来的类型。网上很多图片传输的socket代码都很复杂。本文旨在给出一个简单的demo,如有其他需求可自行扩展。1.对于numpy格式的图片:编码:第一步:_,img_encode=cv2.imencode('.jpg',img_numpy)第二步:img_bytes=img_encode.tobytes()解码:第一步:img_buffer_numpy=np.frombuffer(img_bytes,dtype=np.uint8)第二步:img_numpy=cv2.imdecode(image_buffer_numpy_data,1)2.对于字符串格式的信息:编码时:msg_bytes=msg_str.encode()解码时:msg_str=msg_bytes.decode()server.pyimportsocketimportcv2importnumpyasnpimportosclassVideoServer:def__init__(self):self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#初始化self.sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)self.sock.bind(('127.0.0.1',8002))#将套接字绑定到地址self.sock.listen(1)defGet(self):conn,addr=self.sock.accept()print(addr,'Connected...')os.makedirs('./save',exist_ok=True)whileTrue:img_data=conn.recv(4073800)#这个数必须大于图片的长宽乘积,否则会报错img_name=conn.recv(1024)#将图片字节码字节转换成一个-将维数numpy数组放入缓存img_buffer_numpy=np.frombuffer(img_data,dtype=np.uint8)#从指定内存缓存中读取一维numpy数据,并将数据转换(解码)为图像矩阵格式frame=cv2.imdecode(img_buffer_numpy,1)name=img_name.decode()cv2.imwrite('./save/'+name,frame)print('接收成功',name)self.sock.close()if__name__=='__main__':vs=VideoServer()vs.Get()client.pyimportsocketimportcv2importnumpyimporttimeclassVideoClient:def__init__(self):#连接到服务器(初始化)self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.sock.connect(('127.0.0.1',8002))defSend(self):cap=cv2.VideoCapture('D:/test/ccc/mp4/1.mp4')fps=cap.get(cv2.CAP_PROP_FPS)#获取视频Frameratek=0whilecap.isOpened():success,frame=cap.read()ifsuccess:k+=1ifk%(fps*4)==0:#每4s发送一帧图片#将numpy图像转换为字节字节流_,img_encode=cv2.imencode('.jpg',frame)img_data=img_encode.tobytes()#将字符串字符串转换为字节字节流img_name=(str(k)+'.jpg').encode()#持续发送消息self.sock.send(img_data)self.sock.send(img_name)time.sleep(1)print('%3d.jpg发送成功,休眠1秒'%k)cap.release()self.sock.close()if__name__=='__main__':vc=VideoClient()vc.Send()先启动server.py,再启动client.py,效果如下: