Maison  >  Article  >  développement back-end  >  Code Python pour implémenter la transmission d'images côté client et côté serveur

Code Python pour implémenter la transmission d'images côté client et côté serveur

不言
不言original
2018-09-11 16:57:463302parcourir

Le contenu de cet article concerne le code permettant à Python de réaliser la transmission d'images côté client et côté serveur. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Problème : Utiliser Windows comme client et Linux comme serveur pour transférer le graphique

Procédure :

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

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

Exécuter les résultats :
Serveur :

Code Python pour implémenter la transmission dimages côté client et côté serveur

Client :

Code Python pour implémenter la transmission dimages côté client et côté serveur

Instructions supplémentaires :
1. Exécutez d'abord server.py (python server.py) sous le système Linux, puis exécutez client.py sous le terminal Windows Python et entrez l'image à transférer dans le répertoire actuel dans le nom du terminal, à savoir heat.jpg Vous pouvez voir que le fichier image new_heat.jpg apparaît dans le chemin du serveur, prouvant que le transfert de fichier a réussi.
2. Au début, diverses erreurs se sont produites lors de la référence au code sur Internet. Lors du débogage, les données d'image reçues ont continué à être perdues et l'image n'a pas pu être ouverte. Après avoir compris le format de compression de struct.pack, j'ai trouvé. que la raison était que le problème de réglage des paramètres était à l'origine 128sl, où l est un entier long. S'il dépasse la plage, les données d'image reçues seront perdues. Par conséquent, après le passage à q, la plage devient plus grande et les images peuvent être reçues normalement. . La figure suivante est le tableau de correspondance du format de compression et de la plage de données de struct.pack :

Code Python pour implémenter la transmission dimages côté client et côté serveur
Recommandations associées :

Python XML RPC instances serveur et client

Explication détaillée de la méthode d'implémentation du serveur et du client TCP en python

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn