Python Socket传输图片

系统 2409 0

我们在传输数据时,经常使用tcp/ip的服务器和客户端模型,很多设备也经常将网口作为硬件接口预留出来。可以使用 tcp/ip 传输图像、大的文件等,如果图片过大,还会进行拆分传输,接收方根据对应协议进行解包。解包过程中可能会出现 tcp 粘包现象,所以要根据对应特性进行拆包。本次给大家分享一个小的 python 传输图像的例子,由于数据量不大,没有粘包的现象,以后会给大家分享一个 Qt 下使用 tcp/ip 根据对应协议解析图片的例子。

 

一般在发送图片数据之前会先将图片的大小等相关数据作为一包数据先发送,结束的时候会再次发送结束的数据包,根据包头与包尾来判断图片接收组包是否完整。

 

运行环境:ubuntu 14.04

 

 

先来一个小流程图:


CLIENT                                       SERVER

                    SIZE (image size)

         ---------------------------------->

                      GOT SIZE   

         <----------------------------------

                 send image itself

         ---------------------------------->

                      GOT IMAGE

         <----------------------------------

                      BYE BYE

         ---------------------------------->

                server closes socket

1. Python client send image:


            
              
                try:	
	
    # open image	
    myfile = open(image, 'rb')	
    bytes = myfile.read()	
    size = len(bytes)	
    	
    # send image size to server	
    sock.sendall("SIZE %s" % size)	
    answer = sock.recv(4096)	
	
    print 'answer = %s' % answer	
	
    # send image to server	
    if answer == 'GOT SIZE':	
        sock.sendall(bytes)	
	
        # check what server send	
        answer = sock.recv(4096)	
        print 'answer = %s' % answer	
	
        if answer == 'GOT IMAGE' :	
            sock.sendall("BYE BYE ")	
            print 'Image successfully send to server'	
	
    myfile.close()	
	
finally:	
    sock.close()
              
            


发送图片是客户端,主要是将图片读取为字节,获取字节大小,先发送到服务器端。之后等待服务器应答,服务器向客户端发送 'GOT SIZE' ,表明成功接收到图片大小,之后客户端发送图片字节。这里面主要的就是如何读取图片为字节数据。


2. Python server recv image:

            
              
                while True:	
	
    read_sockets, write_sockets, error_sockets = select.select(connected_clients_sockets, [], [])	
	
    for sock in read_sockets:	
	
        if sock == server_socket:	
	
            sockfd, client_address = server_socket.accept()	
            connected_clients_sockets.append(sockfd)	
	
        else:	
            try:	
	
                data = sock.recv(4096)	
                txt = str(data)	
	
                if data:	
	
                    if data.startswith('SIZE'):	
                        tmp = txt.split()	
                        size = int(tmp[1])	
	
                        print 'got size'	
	
                        sock.sendall("GOT SIZE")	
	
                    elif data.startswith('BYE'):	
                        sock.shutdown()	
	
                    else :	
	
                        myfile = open(basename % imgcounter, 'wb')	
                        myfile.write(data)	
	
                        data = sock.recv(40960000)	
                        if not data:	
                            myfile.close()	
                            break	
                        myfile.write(data)	
                        myfile.close()	
	
                        sock.sendall("GOT IMAGE")	
                        sock.shutdown()	
            except:	
                sock.close()	
                connected_clients_sockets.remove(sock)	
                continue	
        imgcounter += 1	
server_socket.close()
              
            


服务器这边主要是接收到图片字节数据,将图片写到后缀为.png的文件中。

 

程序结果如下:

image3是接收到的图片, dh 是被传输的原图。 QtTcpServer 是用 Qt 写的服务器接收图片程序,下次再分享给大家。


Python Socket传输图片_第1张图片


如果需要完整程序,欢迎公众号后台留言,留下联系方式。


本文主要供学习使用,不做商业用途,如果转载请注明作者与出处,谢谢。


Python Socket传输图片_第2张图片




更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论