python réalisé sous le même réseau local pour transférer des photos

Python peut être transmis par l'image prise réseau, ce qui est très intéressant.

Le TCP utilisation ci-dessous pour obtenir pour python3.

Code Fonction Description

  • Envoyer réalisé sur une infographie (Sender)
  • Réalisées dans un autre ordinateur (ou peut être port différent sur le même ordinateur) Photos accepte (Reciever)
  • une seule fois les cheveux, et seulement une fois de charge
  • De nouvelles images seront plus un préfixe « new_ » sur la vieille photo
  • Le destinataire doit d'abord ouvrir le code du travail après l'expéditeur redémarrage code (sinon sera rejetée directement l'expéditeur du code)
  • Les éléments suivants sont fixés sur un ordinateur (voir l'adresse IP, le ci-dessous est 127.0.0.1, si l'autre ordinateur pour écrire l'adresse IP sur d'autres ordinateurs)
  • En outre, le programme ne peut être utilisé que dans le même réseau local (même sur le réseau étendu, il est nécessaire d'utiliser l'adresse IP WAN)

code

Sender.py (expéditeur):

import socket
import os
import sys
import struct


def sock_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 6666))
except socket.error as msg:
print(msg)
print(sys.exit(1))

while True:
filepath = input('input the file: ')
# filepath = 'test.png'
fhead = struct.pack(b'128sl', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)
s.send(fhead)
print('client filepath: {0}'.format(filepath))

fp = open(filepath, 'rb')
while 1:
data = fp.read(1024)
if not data:
print('{0} file send over...'.format(filepath))
break
s.send(data)
s.close()
break


if __name__ == '__main__':
sock_client()

Reciever.py (bénéficiaires):

import socket
import os
import sys
import struct


def socket_service():
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.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)

print("Wait")

while True:
sock, addr = s.accept()
deal_data(sock, addr)
break
s.close()


def deal_data(sock, addr):
print("Accept connection from {0}".format(addr))

while True:
fileinfo_size = struct.calcsize('128sl')
buf = sock.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', 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()

Resolve

Code de Sender: créer une socket TCP, et d'initier une connexion.

Code spécifique, comme suit:

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 6666))
except socket.error as msg:
print(msg)
print(sys.exit(1))

Alors que le prochain cycle, il commence à envoyer des photos.

Emballé par la bibliothèque struct, puis utiliser les sockets pour envoyer

Note: Une partie du code sur le réseau ne sont pas directement utilisé, comme ici, il est nécessaire de devenir octets str

Pour obtenir le nom du fichier par la bibliothèque OS de base (ce qui est d'éviter certains des documents contenus dans le chemin spécifique)

la taille du fichier acquis par la bibliothèque d'os (décrite par rapport à la taille du fichier acquis par l'Etat)

fhead = struct.pack(b'128sl', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)
s.send(fhead)

Après à nouveau pour obtenir les fichiers en mode binaire.

Puis envoyé, chaque transmission de données de longueur fixe. Lisez d'abord, et détermine ensuite si l'air, puis transmis.

* Extrémité de réception: *

Toujours le même, créer une socket (mais cela doit se lier correspondant ip et port) pour écrire du code spécifique est la suivante :( ici est l'objet socket d'écoute 10, mais n'a pas utilisé dans notre code)

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.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)

Après son entrée en circulation, afin de déterminer si la chaussette d'objet pour obtenir ici va entrer dans l'état bloqué.

Dans les deal_data commencer à obtenir des données via les objets de connexion.

Comme, ou une boucle infinie, mais en fait essentiellement vides, rien de spécial.

Après cela, est passé sur le nom du fichier pour le manipuler, voici le « 128sl », il est en fait une échelle de taille (similaire à la taille de l'emballage de la boîte le chemin). Ensuite, il est d'obtenir un nouveau nom de fichier.

code correspondant est le suivant:

filename, filesize = struct.unpack('128sl', buf)
fn = filename.decode().strip('\x00')
new_filename = os.path.join('./', 'new_' + fn)
之后的recvd_size,其实就是为了来计数的标签。 

Après que nous continuons à recevoir, recevoir en écrivant au dossier qu'après avoir pris fin. Pour fermer le flux de fichier correspondant.

Enfin, la douille est fermée, sortir de la boucle.

Wen réseau source à des fins d'étude, en cas de contact d'infraction supprimé.

Publié 38 articles originaux · a gagné les éloges 1 · views 2179

Je suppose que tu aimes

Origine blog.csdn.net/wulishinian/article/details/105009912
conseillé
Classement