Клиент не получает данные в Python - PullRequest
2 голосов
/ 30 октября 2011

Я очень плохо знаком с Python и у меня есть основной вопрос: может ли клиентская сторона сетевого сокета получать данные?В моем вопросе клиент - это тот, кто инициирует соединение, что, вероятно, очевидно, но я хотел быть ясным.Я спрашиваю, потому что у меня есть другой сервер и клиент (оба python), который позволяет серверу получать файл от клиента.Это работает отлично, но я не могу получить пример, где клиент получает файл.Python постоянно говорит мне, что канал был разорван, и я подозреваю, что он существует, потому что на стороне клиента я использую строку data = mysocket.recv(1024).Я подозреваю, что клиент не видит никаких потоков данных и поэтому закрывает соединение с сервером.Сервер видит это как сломанную трубу.Сервер и клиент находятся ниже.

сервер:

 #libraries to import
 import socket
 import os
 import sys
 import M2Crypto as m2c

 #information about the server the size of the message being transferred
 server_address = '10.1.1.2'
 key_port = 8888
 max_transfer_block = 1024

 FILE = open("sPub.pem","r")

 #socket for public key transfer
 keysocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
 keysocket.bind((server_address, key_port))
 keysocket.listen(1)

 while 1:
         conn, client_addr = keysocket.accept()
         print 'connected by', client_addr
         #sends data to the client
         data = FILE.read()
         keysocket.sendall(data)
 keysocket.close()

Клиент:

 # the specified libraries
 import socket
 import M2Crypto as m2c
 #file to be transferred
 FILE = open("test.txt", "r")
 #address of the server
 server_addr = '10.1.1.2'
 #port the server is listening on
 dest_port = 8888

 data = FILE.read()


 #Creates a socket for the transfer
 mysocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
 mysocket.connect( (server_addr, dest_port) )

 data = mysocket.recv(1024)
 print data
 #creates a new file to store the msg
 name = "serverPubKey.pem"

 #opens the new file and writes the msg to it
 FILE = open (name, "w")
 FILE.write(data)


 #closes the socket.
 mysocket.close()

Буду признателен за любую помощь по данному вопросуСпасибо!

Ответы [ 2 ]

1 голос
/ 30 октября 2011

В таких приложениях иногда бывает полезно обойти детализацию низкого уровня и использовать вместо нее socket.makefile с его API более высокого уровня.

В клиенте закрыть заменить:

data = mysocket.recv(1024)

с:

f = mysocket.makefile('rb')
data = f.read(1024)           # or any other file method call you need

Исходный код для ftplib показывает, как это сделать в рабочем коде.

0 голосов
/ 30 октября 2011

Кроме того, добавляя к предыдущему комментарию, хороший тест иногда состоит в том, чтобы повторить прием несколько раз. Вероятность того, что один проход поймает информацию, отправляемую сервером, маловероятна.

как то так

nreceive = True#nreceive = Not Received
ticks = 0
f = None
while nreceive and ticks < 101:#try to get the info 100 times or until it's received
    ticks+=1
    try:
        f = mysocket.makefile('rb')
        if not f == None:
            nreceive = False
    except:
        pass
data = f.read(1024)
...