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
''' 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 :
Client :
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 :
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!