资讯专栏INFORMATION COLUMN

python实现客户端和服务器端传输图片

andong777 / 1368人阅读

摘要:刚开始在参考网上的代码时出现了各种错误,其中在调试时一直出现接收到的图片数据丢失,打不开图片,弄懂的压缩格式之后,发现是因为参数设置的问题,原来是,其中是长整型,超出范围的话接收到的图片数据就丢失,故改为之后范围变大,能够正常接收图片。

问题:以windows作为客户端,linux作为服务器端,进行传输图片


程序:
"""
Fuction:客户端发送图片和数据
Date:2018.9.8
Author:snowking
"""
###客户端client.py
import socket
import os
import sys
import struct

def sock_client_image():
    while True:
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(("服务器的ip", 6666))  #服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip
            # s.connect(("127.0.0.1", 6666))  #服务器和客户端都在一个系统下时使用的ip和端口
        except socket.error as msg:
            print(msg)
            print(sys.exit(1))
        filepath = input("input the file: ")   #输入当前目录下的图片名 xxx.jpg
        fhead = struct.pack(b"128sq", bytes(os.path.basename(filepath), encoding="utf-8"), os.stat(filepath).st_size)  #将xxx.jpg以128sq的格式打包
        s.send(fhead)

        fp = open(filepath, "rb")  #打开要传输的图片
        while True:
            data = fp.read(1024) #读入图片数据
            if not data:
                print("{0} send over...".format(filepath))
                break
            s.send(data)  #以二进制格式发送图片数据
        s.close()
        # break    #循环发送
   
if __name__ == "__main__":
    sock_client_image()

###服务器端server.py
import socket
import os
import sys
import struct

def socket_service_image():
    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.bind(("服务器的ip", 6666))
        s.listen(10)
    except socket.error as msg:
        print(msg)
        sys.exit(1)

    print("Wait for Connection.....................")

    while True:
        sock, addr = s.accept()  #addr是一个元组(ip,port)
        deal_image(sock, addr)
def deal_image(sock, addr):
    print("Accept connection from {0}".format(addr))  #查看发送端的ip和端口

    while True:
        fileinfo_size = struct.calcsize("128sq")
        buf = sock.recv(fileinfo_size)   #接收图片名
        if buf:
            filename, filesize = struct.unpack("128sq", buf)
            fn = filename.decode().strip("x00")
            new_filename = os.path.join("./", "new_" + fn)  #在服务器端新建图片名(可以不用新建的,直接用原来的也行,只要客户端和服务器不是同一个系统或接收到的图片和原图片不在一个文件夹下)

            recvd_size = 0
            fp = open(new_filename, "wb")

            while not recvd_size == filesize:
                if filesize - recvd_size > 1024:
                    data = sock.recv(1024)
                    recvd_size += len(data)
                else:
                    data = sock.recv(1024)
                    recvd_size = filesize
                fp.write(data)  #写入图片数据
            fp.close()
        sock.close()
        break
        
if __name__ == "__main__":
    socket_service_image()

运行结果:
服务器端:

客户端:

补充说明:
1.首先在linux系统下运行server.py(python server.py),然后在windows python 终端下运行client.py,在终端输入当前目录下要传输的图片名,即heat.jpg,可以看到在服务器的路径下出现了new_heat.jpg图片文件,证明文件传输成功。
2.刚开始在参考网上的代码时出现了各种错误,其中在调试时一直出现接收到的图片数据丢失,打不开图片,弄懂struct.pack的压缩格式之后,发现是因为参数设置的问题,原来是128sl,其中l是长整型,超出范围的话接收到的图片数据就丢失,故改为q之后范围变大,能够正常接收图片。下图是struct.pack的压缩格式和数据范围对应表:


声明:该图表来自https://blog.csdn.net/u011006...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/33623.html

相关文章

  • python实现客户务器传输图片

    摘要:刚开始在参考网上的代码时出现了各种错误,其中在调试时一直出现接收到的图片数据丢失,打不开图片,弄懂的压缩格式之后,发现是因为参数设置的问题,原来是,其中是长整型,超出范围的话接收到的图片数据就丢失,故改为之后范围变大,能够正常接收图片。 问题:以windows作为客户端,linux作为服务器端,进行传输图片 程序: Fuction:客户端发送图片和数据 Date:2018.9.8 ...

    Miracle_lihb 评论0 收藏0
  • python实现客户务器传输图片

    摘要:刚开始在参考网上的代码时出现了各种错误,其中在调试时一直出现接收到的图片数据丢失,打不开图片,弄懂的压缩格式之后,发现是因为参数设置的问题,原来是,其中是长整型,超出范围的话接收到的图片数据就丢失,故改为之后范围变大,能够正常接收图片。 问题:以windows作为客户端,linux作为服务器端,进行传输图片 程序: Fuction:客户端发送图片和数据 Date:2018.9.8 ...

    feng409 评论0 收藏0
  • python实现客户务器传输图片

    摘要:刚开始在参考网上的代码时出现了各种错误,其中在调试时一直出现接收到的图片数据丢失,打不开图片,弄懂的压缩格式之后,发现是因为参数设置的问题,原来是,其中是长整型,超出范围的话接收到的图片数据就丢失,故改为之后范围变大,能够正常接收图片。 问题:以windows作为客户端,linux作为服务器端,进行传输图片 程序: Fuction:客户端发送图片和数据 Date:2018.9.8 ...

    Reducto 评论0 收藏0
  • 第八课 Python Web企业门户网站-人工智能拓展

    摘要:时至今日,人工智能依然是最热门的研究领域之一。众多巨头企业初创企业等纷纷入局人工智能领域,尝试寻找全新突破口。从开发之日起就得到了迅猛发展,获得了众多企业和业界学者的鼎力支持与贡献。 目录 8.1 人工智能概述 8.2 搭建人工智能开放平台 8.2.1 人脸检测后台搭建 8.2.2 本地脚本...

    szysky 评论0 收藏0
  • python实现客户务器传输数据

    摘要:建立两个文件,一个是,存放客户端程序,一个是,存放服务器端程序,首先运行服务器端程序,待连接成功后再运行客户端程序,输入要传输的数据,在服务器终端看到传输过来的数据即为传输成功。 Fuction:python实现客户端和服务器端传输数据Date:2018.9.4Author:SnowKing 客户端 def sock_client_data(): while True: ...

    aisuhua 评论0 收藏0

发表评论

0条评论

andong777

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<