基于Python socket利用TCP协议让上下位机 传输图片
Notes
之前用来做 基于QT 的物联网图形化软件的其中一个功能,因为在这遇到过许多坑所以分享一下我的解决方案,比如图片传输只传输了一部分。。各种丢数据。。最后终于实现了一个有效的方法。
1. 原理
- 在接受图片数据帧前 先让下位机发送一个 图片数据帧的字长。然后在以此为循环出口,不断把接收过来的图片数据帧加起来,最后得到图片的数据帧。
2. 下位机代码:
Server_Host = '192.168.1.1'
ListenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ListenSocket.connect((Server_Host, 1919))
def send_msg(self):
"""发送身份信息到上位机"""
encode_len = str(len(self.pic_data)).encode()
print(len(encode_len))
ListenSocket.send(encode_len)
time.sleep(1)
ListenSocket.send(self.pic_data)
nparr = np.fromstring(self.pic_data, dtype='uint8')
img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
print(img_decode)
cv2.imshow("img_decode", img_decode)
cv2.waitKey(0)
3. 上位机代码:
Server_Host = '192.168.137.1'
Client_Host = '192.168.137.47'
tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpServer.bind((Server_Host, 1919))
tcpServer.listen(10)
img_decode = None
class recvTCP_thread():
def my_recv(self, sock, count):
"""利用接收的图片长度把图片数据帧加起来"""
data = b''
while count:
recvData = sock.recv(count)
if not recvData:
return None
data += recvData
count -= len(recvData)
return data
def recv_img(self):
"""主函数"""
client, address = tcpServer.accept()
while True:
tempdata_len = client.recv(1024).decode()
print(int(tempdata_len))
data = self.my_recv(client, int(tempdata_len))
nparr = np.fromstring(data, dtype='uint8')
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
break
cv2.imshow("img_decode", img)
cv2.waitKey(0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)