Python - сокет не получает данные - PullRequest
0 голосов
/ 08 марта 2012

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

Код сервера ключей:

    def listen(self):
    while True:
        packet, address = self.serverSocket.recvfrom(512)

        mode = str(packet)[2:5]
        self.file = str(str(packet)[6:]).replace("'", "")

        if(mode == "RRQ"):
            self.sendResponse(address)
        else:
            self.receiveData()

def receiveData(self):
    data = open("new1.jpg", "wb")
    while True:
        packet, server = self.serverSocket.recvfrom(512)
        if packet.__len__() == 512:
            data.write(packet)
        else:
            data.write(packet)
            break;

Код ключа клиента:

    def sendWRQ(self):
    request = 'WRQ-' + self.file
    self.clientSocket.sendto(str(request).encode(), (self.serverAddress, self.serverPort))
    self.sendData()

def sendData(self):
    with open(self.file, "rb") as data:
        while True:
            packet = data.read(512)
            if packet != b"":
                self.clientSocket.sendto(packet, (self.serverAddress, self.serverPort))
            else:
                self.clientSocket.sendto(packet, (self.serverAddress, self.serverPort))
                break
            time.sleep(0.0005)
  1. Клиент отправляет пакет WRQ с именем файла, который будет ключом передачи
  2. Реког сервера. тип передачи RRQ или WRQ в этом случае и начинает прослушивание передача через receiveData ().

Клиент завершает работу после отправки sendWRQ (), теперь возникает проблема на сервере или на стороне клиента в sendData или receiveData. Я получаю файл размером 0 КБ

Весь код:

1 Ответ

0 голосов
/ 08 марта 2012

Метод, которым клиент сообщает серверу о завершении файла, неверен.

В вашем коде, когда файл будет завершен, на стороне клиента вы будете вызывать «sendto» для отправки пустой строки, но это на самом деле ничего не даст;на стороне сервера вы используете условие «пакет. len () == 512», чтобы определить, завершен ли файл, однако, во время процесса передачи, если процессор сервера работает быстрее, чем скорость передачиВы будете часто получать нулевую длину пакета, но это не означает, что передача завершена, возможно, следующий пакет только в пути.

Я предлагаю использовать специальную команду, чтобы указать конец передачии сервер прервет цикл только при получении этой команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...