it-swarm.com.de

Senden Sie eine Datei über Sockets in Python

Ich versuche in Python ein Programm zu erstellen, das Sockets implementiert. Jeder Client sendet eine PDF -Datei. Der Server erhält sie und der Titel wird in "file_number.pdf" (d. H. File_1.pdf) geändert. Das Problem ist, dass nur ein Client eine Datei erfolgreich senden kann. Wenn ein zweiter Client versucht, das Programm zu senden, stürzt das Programm ab. Was mache ich falsch und wie kann ich meinen Code lösen, damit N Clients (mit N <20) eine Verbindung zum Server herstellen und Dateien übertragen können?

Hier ist der Servercode:

import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Acepta hasta 10 conexiones entrantes.
sc, address = s.accept()

print address
i=1
f = open('file_'+ str(i)+".pdf",'wb') # Open in binary
i=i+1
while (True):

    # Recibimos y escribimos en el fichero
    l = sc.recv(1024)
    while (l):
        f.write(l)
        l = sc.recv(1024)
f.close()

sc.close()
s.close()

Hier ist der Client-Code:

import socket
import sys

s = socket.socket()
s.connect(("localhost",9999))
f = open ("libroR.pdf", "rb")
l = f.read(1024)
while (l):
    s.send(l)
    l = f.read(1024)
s.close()

Um den Code zu vereinfachen, verwende ich immer ein Buch mit dem Dateinamen "libroR.pdf". Im gesamten Code wird es jedoch von einer grafischen Benutzeroberfläche ausgewählt.

18
franvergara66

Sie müssen den gesamten Code von sc, address = s.accept() bis sc.close() in eine andere Schleife einfügen, da der Server nach dem Empfang der ersten Datei einfach beendet wird. Es stürzt nicht ab, das Skript ist gerade fertig.

[EDIT] Hier ist der überarbeitete Code:

import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Accepts up to 10 connections.

while True:
    sc, address = s.accept()

    print address
    i=1
    f = open('file_'+ str(i)+".pdf",'wb') #open in binary
    i=i+1
    while (True):       
    # receive data and write it to file
        l = sc.recv(1024)
        while (l):
                f.write(l)
                l = sc.recv(1024)
    f.close()


    sc.close()

s.close()

Beachten Sie, dass s.listen(10) bedeutet " maximale Akzeptanzrate auf 10 Verbindungen setzen ", nicht "nach 10 Verbindungen aufhören".

13
Aaron Digulla

Ihr Code bleibt in der zweiten while-Schleife hängen.

Sehen:

import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10)

i=1

while True:
    sc, address = s.accept()

    print address

    f = open('file_'+str(i)+".pdf",'wb') #open in binary
    i=i+1
    print(i)
    l = 1
    while(l):
        l = sc.recv(1024)
        while (l):
            f.write(l)
            l = sc.recv(1024)
        f.close()


    sc.close()

s.close()
4
user2059807

Sie schließen den Server-Socket (s in Ihrem Code), nachdem Sie die erste Clientverbindung hergestellt haben. Daher wird immer nur ein Client von Ihrem Server behandelt. Machen Sie eine Schleife um accept und lesen Sie von sc.

1

Mit diesem Code können Sie Dateien mit demselben client.py mehrfach senden

Server.py

import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Acepta hasta 10 conexiones entrantes.

i = 1
while True:
    sc, address = s.accept()

    print address
    f = open('file_'+ str(i)+".wav",'wb') #open in binary
    i=i+1
    while (True):
        # recibimos y escribimos en el fichero
        l = sc.recv(1024)
        f.write(l)

        if not l:
            break

    f.close()
    sc.close()
    print('copied the file.')

s.close()
0
user2973566