这篇文章主要为大家详细介绍了python使用tcp传输图片数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了python使用tcp传输图片数据的具体代码,供大家参考,具体内容如下

数据包格式如下

客户端:

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

import socket

import sys

  

HOST,PORT = "172.18.0.3",19984

  

def main():

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    sock.connect((HOST, PORT))

     

    #包头标志

    arrBuf = bytearray(b'\xff\xaa\xff\xaa')

     

    #以二进制方式读取图片

    picData = open('1.jpg', 'rb')

    picBytes = picData.read()

     

    #图片大小

    picSize = len(picBytes)

     

    #数据体长度 = guid大小(固定) + 图片大小

    datalen = 64 + picSize

     

    #组合数据包

    arrBuf += bytearray(datalen.to_bytes(4, byteorder='little'))

    guid = 23458283482894382928948

    arrBuf += bytearray(guid.to_bytes(64, byteorder='little'))

    arrBuf += picBytes

     

    sock.sendall(arrBuf)

    sock.close()

  

if __name__ == '__main__':

    main()

服务端:

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

51

52

53

54

55

56

57

58

59

import socketserver

import os

import sys

import time

import threading

  

ip_port=("172.18.0.3",19984)

  

class MyServer(socketserver.BaseRequestHandler):

    def handle(self):

        print("conn is :",self.request) # conn

        print("addr is :",self.client_address) # addr

         

        while True:

            try:

                self.str = self.request.recv(8)

                data = bytearray(self.str)

                headIndex = data.find(b'\xff\xaa\xff\xaa')

                print(headIndex)

                 

                if headIndex == 0:

                    allLen = int.from_bytes(data[headIndex+4:headIndex+8], byteorder='little')

                    print("len is ", allLen)

  

                    curSize = 0

                    allData = b''

                    while curSize < allLen:

                        data = self.request.recv(1024)

                        allData += data

                        curSize += len(data)

  

                    print("recv data len is ", len(allData))

                    #接收到的数据,前64字节是guid,后面的是图片数据

                    arrGuid = allData[0:64]

                    #去除guid末尾的0

                    tail = arrGuid.find(b'\x00')

                    arrGuid = arrGuid[0:tail]

                    strGuid = str(int.from_bytes(arrGuid, byteorder = 'little')) #for test

                     

                    print("-------------request guid is ", strGuid)

                    imgData = allData[64:]

                    strImgFile = "2.jpg"

                    print("img file name is ", strImgFile)

  

                    #将图片数据保存到本地文件

                    with open(strImgFile, 'wb') as f:

                        f.write(imgData)

                        f.close()

                         

                    break

            except Exception as e:

                print(e)

                break

  

  

if __name__ == "__main__":

    s = socketserver.ThreadingTCPServer(ip_port, MyServer)

    print("start listen")

    s.serve_forever()


点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部