2012-02-21 17 views
15

Próbuję utworzyć program w Pythonie, który implementuje gniazda, każdy klient wysyła plik PDF, a serwer go otrzymuje, a tytuł zostaje zmieniony na "file_number.pdf" (np. Plik_1 .pdf). Przedstawiony problem polega na tym, że tylko klient może wysłać plik z powodzeniem. Gdy drugi klient próbuje wysłać program ulega awarii. Co robię źle i jak mogę rozwiązać mój kod, aby umożliwić N klientom (z N < 20) połączyć się z serwerem i przesyłać pliki?Wysyłanie pliku za pomocą gniazd w języku Python

Oto kod serwera:

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

Oto kod klienta:

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

Aby uprościć mój kod zawsze używam książkę z nazwy pliku „libroR.pdf”, ale w pełnej kod jest wybierany przez graficzny interfejs użytkownika.

+0

Pokaż nam błędy i powiedzieć nam, czy jest to klient lub serwer, który jest naruszona. – Marcin

+0

@Marcin nie uczy mnie żadnych błędów, tylko pierwszy klient wysyła plik i kończy się pomyślnie, a serwer nadal czeka na więcej żądań, gdy drugi klient próbuje się połączyć, program kliencki po prostu nie robi nic i pozostaje w trybie gotowości. – franvergara66

Odpowiedz

12

Musisz umieścić cały kod z sc, address = s.accept() do sc.close() w innej pętli lub serwer kończy się po otrzymaniu pierwszego pliku. To się nie psuje, skrypt jest właśnie zakończony.

[EDIT] Oto poprawiony kod:

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

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):  
    # 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() 

Zauważ, że s.listen(10) oznacza "set maximum accept rate to 10 connections", a nie "stop po 10 połączeń".

+0

inna pętla poza pętlą odczytu gniazda? Nie mam jasnego pomysłu – franvergara66

+0

Właściwie s.listen (10) oznacza "zezwalaj na maksymalnie 10 nieakceptowanych() ed przychodzących połączeń TCP, które mają być w kolejce ułożone przez stos TCP w tym samym czasie". Jeśli 10 przychodzących połączeń TCP znajduje się już w kolejce stosu TCP dla tego gniazda, wszelkie dodatkowe zostaną odrzucone (dopóki program nie odrzuci kolejki przez zaakceptowanie() niektórych połączeń w niej) –

1

Zamykasz gniazdo serwera (s w kodzie) po obsłudze pierwszego połączenia klienta. Tak więc tylko jeden klient jest obsługiwany przez twój serwer. Wykonaj pętlę około accept i odczytaj z sc.

3

Twój kod utknął w drugiej pętli while.

Patrz:

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() 
Powiązane problemy