当前位置: 首页 > Linux

Python实现客户端与服务端图片传输

时间:2023-04-06 23:22:10 Linux

问题:windows作为客户端,linux作为服务端传输图片程序:'''功能:客户端发送图片和数据日期:2018.9.8作者:snowking'''###clientclient.pyimportsocketimportosimportsysimportstructdefsock_client_image():whileTrue:try:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect(('server'sip',6666))#IP和端口server和client在不同系统或者不同主机使用,首先查看server所在系统的网卡ip#s.connect(('127.0.0.1',6666))#Server和client的ip两端同系统时使用的端口exceptsocket.errorasmsg:print(msg)print(sys.exit(1))filepath=input('inputthefile:')#输入当前目录下的图片Namexxx.jpgfhead=struct.pack(b'128sq',bytes(os.path.basename(filepath),encoding='utf-8'),os.stat(filepath).st_size)#设置xxx.jpg为128sqformatpackagings.send(fhead)fp=open(filepath,'rb')#打开要传输的图片whileTrue:data=fp.read(1024)#读入图片dataifnotdata:print('{0}送过去...'。格式(文件路径))breaks.send(data)#以二进制格式发送图像数据s.close()#break#循环发送if__name__=='__main__':sock_client_image()###Serversideserver.pyimportsocketimportosimportsysimportstructdefsocket_service_image():尝试: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(('server'sip',6666))s.listen(10)exceptsocket.errorasmsg:print(msg)sys.exit(1)print("等待连接................")whileTrue:sock,addr=s.accept()#addr是一个元组(ip,port)deal_image(sock,addr)defdeal_image(sock,addr):print("Acceptconnectionfrom{0}".format(addr))#检查发送方的ip和端口whileTrue:fileinfo_size=struct.calcsize('128sq')buf=sock.recv(fileinfo_size)#接收图片名ifbuf:filename,文件大小=struct.unpack('128sq',buf)fn=filename.decode().strip('\x00')new_filename=os.path.join('./','new_'+fn)#在服务器端新建一个图片名(可以用原来的而不是新的也可以,只要客户端和服务器不在同一个系统或者接收到的图片和原图不在同一个文件夹即可)recvd_size=0fp=open(new_filename,'wb')而不是recvd_size==filesize:如果filesize-recvd_size>1024:data=sock.recv(1024)recvd_size+=len(data)else:data=sock.recv(1024)recvd_size=filesizefp.write(data)#写入图片数据fp.close()sock.close()breakif__name__=='__main__':socket_service_image()运行结果:服务器端:客户端:补充说明:1.首先运行server.py(pythonserver.py)linux系统下,然后windows下python终端运行client.py,在终端输入当前目录下要传输的图片名称,即heat.jpg,可以看到new_heat.服务器路径下出现jpg图片文件,证明文件传输成功2、一开始参考网上的代码出现各种错误。其中,调试时接收到的图片数据丢失,无法打开图片。了解了struct.pack的压缩格式后,发现是参数设置的问题。问题是它是128sl,其中l是一个长整数。如果超出范围,接收到的图片数据将丢失。所以改成q后,范围变大,可以正常接收画面。下图是struct.pack的压缩格式和数据范围对应表:声明:本图表来自https://blog.csdn.net/u011006...