2013-06-23 3 views
0

Я пытаюсь отправить файл с сервера на клиент, но получить ошибки. Пожалуйста, дайте мне знать, где я делаю неправильно.Python: ошибки передачи файлов

Это мой код сервера:

if msg in data.keys(): 
print("Requested file exists", msg) 
    f=open(msg,"rb") 
    datam= f.read(1024) 

    while (datam): 

     if(s.send(datam)): 

     print "sending data" 

     datam = f.read(1024) 



     s.close() 

     f.close 
else: 
    print("File Not found",msg) 
    print("File Not found",data.keys()) 
    c.close()    # Close the connection 

где тзд содержит адрес путь, где файл существует C = клиентский сокет S = сервер сокет Я хочу прочитать этот файл и отправить его клиенту, но я получаю эта ошибка

Got connection from ('127.0.0.1', 42330) 
('Requested file exists', '/home/beenish/Pictures/pew.txt') 
Traceback (most recent call last): 
File "server.py", line 41, in <module> 
if(s.send(datam)): 
socket.error: [Errno 32] Broken pipe 

на стороне клиента, я написал этот код, чтобы получать этот файл

s.listen(15) 
f = open('\home\beenish\pictures\lol.txt', 'wb') 
data = s.recv(1024) 

while(data): 


f.write(data) 

data=s.recv(1024) 

    f.close() 
    s.close      # Close the socket when done 

где s является сокет клиента

Здесь я получаю эту ошибку

Traceback (most recent call last): 
File "client.py", line 26, in <module> 
s.listen(15) 
File "/usr/lib/python2.7/socket.py", line 224, in meth 
return getattr(self._sock,name)(*args) 
socket.error: [Errno 22] Invalid argument 
+0

Положите отправку/прием в блок try/catch/finally: когда сообщение становится кислым, вы просто полностью закрываете розетку и не позволяете вашей программе взорваться. – lucasg

ответ

0

На стороне клиента вы имеете ошибку на этой линии:

s.listen(15) 

И Python docs сказать, что аргумент имеет системный зависимый максимум, обычно 5. Поэтому попробуйте выяснить максимальную для своей системы просто меньшее значение и посмотреть, что произойдет.

Ошибка на стороне сервера может быть побочным эффектом сбоя на стороне клиента.

0

Это ошибка, которую вы получаете, когда звоните socket.listen перед вызовом socket.bind. Имейте в виду, что сервер всегда должен следовать последовательности socket(), bind(), listen() и accept() в этом конкретном заказе.

+0

На стороне сервера я уже следую этой же последовательности. Я думаю, что есть некоторая проблема с методом отправки во время цикла на стороне сервера, но я не уверен ... – Xara

+0

@Zara Я проверил его снова, и теперь вижу другое: вы вызываете 'bind' на клиенте , в то время как вы должны вызывать только 'socket()' и 'connect()'. –

+0

Не могли бы вы рассказать ... Я не понимаю – Xara