PHP前端开发

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

百变鹏仔 3小时前 #Python
文章标签 服务器端

本篇文章给大家带来的内容是关于python实现客户端和服务器端传输图片的代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

程序:

'''Fuction:客户端发送图片和数据Date:2018.9.8Author:snowking'''###客户端client.pyimport socketimport osimport sysimport structdef 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.pyimport socketimport osimport sysimport structdef 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('')            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()

运行结果:
服务器端:

立即学习“Python免费学习笔记(深入)”;

客户端:

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