2014-12-02 12 views
25

Sono riuscito a copiare il contenuto del file (immagine) in un nuovo file. Tuttavia quando provo la stessa cosa su socket TCP sto affrontando problemi. Il loop del server non si sta esaurendo. Il loop client termina quando raggiunge EOF, tuttavia il server non è in grado di riconoscere EOF.Invio di un file tramite socket TCP in Python

Ecco il codice:

Server

import socket    # Import socket module 

s = socket.socket()   # Create a socket object 
host = socket.gethostname() # Get local machine name 
port = 12345     # Reserve a port for your service. 
s.bind((host, port))  # Bind to the port 
f = open('torecv.png','wb') 
s.listen(5)     # Now wait for client connection. 
while True: 
    c, addr = s.accept()  # Establish connection with client. 
    print 'Got connection from', addr 
    print "Receiving..." 
    l = c.recv(1024) 
    while (l): 
     print "Receiving..." 
     f.write(l) 
     l = c.recv(1024) 
    f.close() 
    print "Done Receiving" 
    c.send('Thank you for connecting') 
    c.close()    # Close the connection 

client

import socket    # Import socket module 

s = socket.socket()   # Create a socket object 
host = socket.gethostname() # Get local machine name 
port = 12345     # Reserve a port for your service. 

s.connect((host, port)) 
s.send("Hello server!") 
f = open('tosend.png','rb') 
print 'Sending...' 
l = f.read(1024) 
while (l): 
    print 'Sending...' 
    s.send(l) 
    l = f.read(1024) 
f.close() 
print "Done Sending" 
print s.recv(1024) 
s.close      # Close the socket when done 

Ecco lo screenshot:

Server Server

client Client

Edit 1: dati aggiuntivi copiato. Rendere il file "non completo". La prima colonna mostra l'immagine che è stata ricevuta. Sembra essere più grande di quello inviato. Per questo motivo, non sono in grado di aprire l'immagine. Sembra un file danneggiato.

File sizes

Edit 2: Questo è come lo faccio nella console. Le dimensioni dei file sono le stesse qui. Python Console Same file sizes

risposta

18

client bisogno di comunicare che è finito l'invio, utilizzando socket.shutdown (non socket.close che chiudono sia in lettura/scrittura da parte della presa):

... 
print "Done Sending" 
s.shutdown(socket.SHUT_WR) 
print s.recv(1024) 
s.close() 

UPDATE

client invia Hello server! al server; che viene scritto nel file sul lato server.

s.send("Hello server!") 

Rimuovere la riga precedente per evitarlo.

+0

Grazie per avermi aiutato! Ho provato questo, ma è ancora in loop. Il problema che penso sia che il client invia non è mai l'invio di EOF, perché una volta raggiunto EOF, sta uscendo dal ciclo e non lo invia mai al server. È questo l'errore? –

+2

@SwaathiK, Ah, il client è in attesa dei dati, al termine dell'invio. Ho aggiornato la risposta. Per favore controlla. – falsetru

+0

Grazie mille! Ha funzionato come un fascino. Ma ho solo un'altra domanda, perché il file non viene ricostruito dal lato server? Copia tutto, ma il file non è completo. Spero di avere un senso. –

0

Il problema è un ulteriore 13 byte che server.py riceve all'inizio. Per risolvere ciò scrivi "l = c.recv (1024)" due volte prima del ciclo while come sotto.

print "Receiving..." 
l = c.recv(1024) #this receives 13 bytes which is corrupting the data 
l = c.recv(1024) # Now actual data starts receiving 
while (l): 

Questo risolve il problema, provato con diversi formati e dimensioni di file. Se qualcuno sa a cosa si riferisce questo 13 byte iniziali, per favore rispondi.

+1

Penso che "Hello server!" Sia il 13 byte che stai cercando. – Alex

6

Rimuovere sottostante Codice

s.send("Hello server!") 

perché la vostra inviando s.send("Hello server!") al server, in modo che il file di output è un po 'più in termini di dimensioni.

0

file di mettere dentro while True in questo modo

while True: 
    f = open('torecv.png','wb') 
    c, addr = s.accept()  # Establish connection with client. 
    print 'Got connection from', addr 
    print "Receiving..." 
    l = c.recv(1024) 
    while (l): 
     print "Receiving..." 
     f.write(l) 
     l = c.recv(1024) 
    f.close() 
    print "Done Receiving" 
    c.send('Thank you for connecting') 
    c.close()