2014-02-12 1 views
0

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

from socket import * 
import thread 

def handler(clientsocket, clientaddr): 
    print "Accepted connection from: ", clientaddr 

    while 1: 
     data = clientsocket.recv(8192) 
     if not data: 
      break 
     else: 
      print "The following data was received - ",data 
      print "Opening file - ",data 
      fp = open(data,'r') 
      strng = "hi" 
      while strng: 
       strng = fp.read(8192) 
       clientsocket.send (strng) 


    clientsocket.close() 

if __name__ == "__main__": 

    host = 'localhost' 
    port = 55574 
    buf = 8192 

    addr = (host, port) 

    serversocket = socket(AF_INET, SOCK_STREAM) 

    serversocket.bind(addr) 

    serversocket.listen(5) 

    while 1: 
     print "Server is listening for connections\n" 

     clientsocket, clientaddr = serversocket.accept() 
     thread.start_new_thread(handler, (clientsocket, clientaddr)) 
    serversocket.close() 

Client.py:

from socket import * 
import os 
if __name__ == '__main__': 

    host = 'localhost' 
    port = 55574 
    buf = 8192 

    addr = (host, port) 

    clientsocket = socket(AF_INET, SOCK_STREAM) 

    clientsocket.connect(addr) 

    while 1: 
     fname = raw_input("Enter the file name that u want>> ") 
     if not fname: 
      break 
     else: 
      clientsocket.send(fname) 
      print "\nThe file will be saved and opened- " 
      fname = '/home/coep/Downloads/'+fname 
      nf = open(fname,"a") 
      strng = "hi" 
      while strng: 
       strng = clientsocket.recv(8192) 
       nf.write(strng) 

      nf.close() 
      fname = 'viewnior '+ fname 
      print fname 
      os.system(fname) 
+0

Вы должны использовать 'sendall()' вместо 'send()', если вы не хотите тщательно проверять возвращаемое значение 'send()'. –

ответ

0

Попробуйте изменить:

  while strng: 
       strng = clientsocket.recv(8192) 
       nf.write(strng) 

To:

  while True: 
       strng = clientsocket.recv(8192) 
       if not strng: 
        break 
       nf.write(strng) 
0

Там в так много вещей rong с этим кодом:

1) Как сервер, так и клиент. Отправка и получение файлов может быть сложной задачей. Посмотрите на это:

while strng: 
    strng = clientsocket.recv(8192) 
    nf.write(strng) 

Бесконечный цикл. Вы должны добавить

while strng: 
    strng = clientsocket.recv(8192) 
    if not strng: 
     break 
    nf.write(strng) 

к серверу. Но клиент не будет знать, когда вы прекратили передачу файла (и это источник вашей проблемы). Поэтому вам нужно либо отправить значение STOP (что может быть сложно, если файл содержит такую ​​строку), либо отправить размер файла перед отправкой содержимого (чтобы клиент знал, сколько данных он должен прочитать). Второе решение является предпочтительным (например, так работает HTTP).

2) Не используйте модуль thread. Это низкий уровень, и легко ошибаться. Используйте threading.

3) Сервер. Вы открываете файл с fp = open(data,'r'), но вы его нигде не закрываете. Вместо того, чтобы использовать with:

with open(data, 'r') as fp: 
    # the code that uses fp goes here 

Он автоматически закроет файл, как только он покидает блок.

4) Не используйте os.system, если вам абсолютно не нужно. Я понимаю, что это только для отладки, но хороший совет.

5) Используйте socket.sendall вместо socket.send, если вы не хотите беспокоиться о сложных функциях вызова системы send. Может быть, в вашем случае не имеет значения.