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


本文摘自php中文网,作者不言,侵删。

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

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

程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

'''

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()


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

###服务器端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()


运行结果:
服务器端:

2039470964-5b92843fc1a66_articlex.png

客户端:

1526422411-5b92823cc424e_articlex.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的压缩格式和数据范围对应表:

1832972653-5b927ef6c239a_articlex.png
相关推荐:

Python XML RPC服务器端和客户端实例

python实现TCP服务器端与客户端的方法详解

以上就是python实现客户端和服务器端传输图片的代码的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python color怎么设置

Python类变量和实例变量的区别

Python怎么读取csv文件

Python中下划线怎么打

Python如何安装wordcloud库

Python 拷贝特定后缀名文件,并保留原始目录结构的实例

没学过编程可以自学Python

Python中关于闭包的使用实例

Python三大框架:flask框架、tornado框架、django框架简介

Python中pop什么意思

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...