Heim >Backend-Entwicklung >Python-Tutorial >Python-Code zur Implementierung der clientseitigen und serverseitigen Bildübertragung
Der Inhalt dieses Artikels befasst sich mit dem Code für die clientseitige und serverseitige Bildübertragung. Ich hoffe, dass er für Freunde hilfreich ist.
Problem: Verwenden Sie Windows als Client und Linux als Server, um das Diagramm zu übertragen
''' 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()
Ergebnisse ausführen:
Server:
Client:
Ergänzend Anleitung:
1. Führen Sie zuerst server.py (python server.py) unter dem Linux-System aus, führen Sie dann client.py unter dem Windows-Python-Terminal aus und geben Sie den Namen des zu übertragenden Bildes im aktuellen Verzeichnis ein Terminal, bei dem es sich um heat.jpg handelt, können Sie sehen, dass die Bilddatei new_heat.jpg im Serverpfad angezeigt wird, was beweist, dass die Dateiübertragung erfolgreich war.
2. Beim Verweisen auf den Code im Internet gingen zunächst immer wieder die empfangenen Bilddaten verloren und das Bild konnte nicht geöffnet werden Der Grund dafür war ursprünglich 128sl, wobei l eine lange Ganzzahl ist. Wenn es den Bereich überschreitet, gehen die empfangenen Bilddaten verloren. Daher wird der Bereich nach dem Wechsel zu q größer und Bilder können normal empfangen werden . Die folgende Abbildung zeigt die Komprimierungsformat- und Datenbereichskorrespondenztabelle von struct.pack:
Verwandte Empfehlungen:
Python XML RPC Server- und Client-Instanzen
Detaillierte Erläuterung der Methode zur Implementierung von TCP-Server und -Client in Python
Das obige ist der detaillierte Inhalt vonPython-Code zur Implementierung der clientseitigen und serverseitigen Bildübertragung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!