博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python实现客户端和服务器端传输图片
阅读量:6569 次
发布时间:2019-06-24

本文共 2907 字,大约阅读时间需要 9 分钟。

问题:以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('\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()

运行结果:

服务器端:

clipboard.png

客户端:

clipboard.png

补充说明:

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

clipboard.png

声明:该图表来自

转载地址:http://sfvjo.baihongyu.com/

你可能感兴趣的文章
php函数,static,globalkeyword及三种变量作用域
查看>>
ODOO权限管理,在两个方面设置权限
查看>>
Java中的扫描器
查看>>
JQ 4
查看>>
总结-软件工程师 ( 编程能力 )
查看>>
江西理工大学计算机管理技术期末复习(wangzhendong)网络管理与维护
查看>>
服务器操作
查看>>
Sql server中时间函数用法详解
查看>>
常用的伪类和伪元素
查看>>
MFC调用批处理文件(.bat)
查看>>
喜得千金,升级做爸爸喽
查看>>
Ubuntu 17 安装 tensorflow
查看>>
红外协议之NEC协议
查看>>
于媛龄(201552118)第二次作业网调问卷的制作
查看>>
SecureRandom
查看>>
Windows下Redis中RedisQFork位置调整
查看>>
通过javacv对视频每隔1秒钟截取1张图片
查看>>
java入门(1) 程序运行机制及运行过程
查看>>
Python入门(good)
查看>>
程序员必须知道的几个Git代码托管平台(转)
查看>>