0
点赞
收藏
分享

微信扫一扫

python socket传输图片,先解码发送,再接收解码加显示

全栈学习笔记 2022-01-11 阅读 67

这个也是在之前网友的基础下改的。费了很多时间。记录一下。希望能帮到有需要的人。

之前用了一个博主的视频socket传输,是从客户端发送到服务端,然后我想把方向改过来,但是一直没成功。后来转念一想,视频就是连续的图片,如果我能传输图片,那么传输视频应该也没问题,所以就尝试传输图片。

主要思路:服务端先对图片解码,然后发送;客户端接收,再解码,显示出来。接收的时候有个参数是接收数据的大小的,这个参数宜大不宜小,我测试发现小于图片大小会有问题。

注意:需要先运行服务端的py文件

1,服务端

#!/usr/bin/env python
# -*- coding=utf-8 -*-

import socket
import numpy as np
import urllib
import cv2
import threading
import time


print('this is Server')

img = cv2.imread('666.jpg')#这个是我本地的图片,和这个py文件在同一文件夹下,注意格式
# '.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
img_encode = cv2.imencode('.jpg', img)[1]

data_encode = np.array(img_encode)
str_encode = data_encode.tostring()
encode_len = str(len(str_encode))
print(encode_len)#输出看一下encode码的大小,可有可无

def socket_service():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind(('127.0.0.1', 6666))
        s.listen(10)
    except socket.error as msg:
        print msg
        sys.exit(1)
    print 'Waiting connection...'

    while True:
        conn, addr = s.accept()
        t = threading.Thread(target=deal_data, args=(conn, addr))
        t.start()

def deal_data(conn, addr):
    print 'Accept new connection from {0}'.format(addr)
    while True:
        conn.send(str_encode)#发送图片的encode码
        time.sleep(1)
    conn.close()

socket_service()

2,客户端

#!/usr/bin/env python
# -*- coding=utf-8 -*-

import socket
import numpy as np
import urllib
import cv2
import threading
import time


def socket_client():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('127.0.0.1', 6666))#连接服务端
    except socket.error as msg:
        print msg
        sys.exit(1)
    
    print('this is Client')
    while True:
        receive_encode = s.recv(2147483647)#接收的字节数 最大值 2147483647 (31位的二进制)
        nparr = np.fromstring(receive_encode, dtype='uint8')
        img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
        cv2.imshow("img_decode", img_decode)#显示图片
        cv2.waitKey(1)

socket_client()

效果图:

附:测试完这个图片的解码后,后面应该可以用opencv获取摄像头画面帧,然后用类似的方法发送出去,从而达到传输视频的效果。

举报

相关推荐

0 条评论