2014-02-18 1 views
0

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

server.py

from socket import * 
import thread 
import os 

l = {} 
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 
      l[clientaddr] = data 
      print l 
      print "Opening file - ",data 
      fp = open(data,'r') 
      size = os.path.getsize(data) 
      clientsocket.send(str(size)) 
      strng = "hi" 
      print size 
      while size > 0: 
       strng = fp.read(8192) 
       clientsocket.send (strng) 
       size = size - 8192 

    clientsocket.close() 



if __name__ == "__main__": 

    host = 'localhost' 
    port = 55573 
    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 = '10.1.99.176' 
    port = 55573 
    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" 
      size = clientsocket.recv(16) 
      size = long(size) 
      print size 
      while size > 0: 
       strng = clientsocket.recv(8192) 
         if not strng: 
          break 
         nf.write(strng) 
       size = size - 8192 
       if size > 500000: 
        print size 

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

другая машина на тех же ip-доменах? –

+1

Возможно, у вас есть межсетевой экран, блокирующий порт 55573? –

+0

есть. Они находятся в локальной сети. –

ответ

1

В server.py, вы используете

хост = 'локальный', и это будет просто связывать порт на локальный адрес Ip, т.е. 127.0.0.1.

Измените его на host = '0.0.0.0', и он свяжет конкретный порт со всеми доступными интерфейсами.

Обновление: Еще одна причина может быть в том, что размер буфера слишком велик и с 8192, он может блокироваться навсегда, потому что последняя передача никогда не была в состоянии заполнить буфер. Чтобы обойти это, установите таймаут, чтобы заставить действовать, если буфер не заполняется. В client.py, попробуйте изменить,

clientsocket.timeout(5) 
    while size > 0: 
      try: 
       strng = clientsocket.recv(8192) 
       if not strng: 
        break 
       nf.write(strng) 
       size = size - 8192 
       if size > 500000: 
        print size 
      except: 
       nf.write(string) 

Также 8192 довольно большой размер и попытаться уменьшить размер до 1000-1300 байт. Chossing 8192 не дает вам никаких преимуществ, поскольку пакеты все равно будут перемещаться по фрагментам с верхним пределом MTU, который обычно составляет 1436 байт.

+0

Это уже сделано. Но все же есть неполная передача данных. –

+0

Я обновил ответ. – Akamai

+0

Теперь я изменил размер буфера на 512 байт, и программа работает нормально, но все же есть потеря большого количества байтов. –