Функция recv() не ожидает данных

У меня есть клиент-серверное приложение, которое я делаю, и у меня возникают проблемы, когда сервер ожидает данных от клиента.

После того, как мой клиент подключается к сокету сервера, сервер открывает ему новый поток и получает данные от клиента (в формате JSON). Пока мой код работает для одного сообщения. Когда я добавил цикл while, который всегда принимает сообщения, у меня возникла проблема. После некоторых тестов я обнаружил, что функция recv() не ждет новых данных и переходит к следующей строке, и это создает проблему. Буду рад, если вы поможете мне решить проблему.

мой цикл приема данных (первая итерация цикла работает, но получение данных во второй итерации не ждет данных и создает проблему, потому что следующая строка не получает никаких данных) -

    while True:
        data = self.client.recv(self.size) # receive data
        message = self.JSON_parser(data) # parser the data (data in json format)
        process_message = processing.Processing(message[0]['key'],message[0]['user'],message[0]['data']) # send the receive data to the initialize process
        process_return = process_message.action() # call to the action function
        self.client.send(process_return) # send to the client message back

person PO. li    schedule 02.02.2016    source источник
comment
Что такое data после возвращения recv()? Пустая строка?   -  person Andrea Corbellini    schedule 02.02.2016
comment
Проблема в том, что на сервер не отправляются данные, поэтому recv() не получает данные (recv() нужно ждать, но он не ждет, и ничего нет), пустой.   -  person PO. li    schedule 02.02.2016
comment
Пустая строка означает закрытое соединение. Либо клиент, либо сервер закрывает сокет после первого сообщения   -  person Andrea Corbellini    schedule 02.02.2016
comment
Спасибо, я не знаю, что это означает, что клиент или сервер закрывает сокет +1 ( ;   -  person PO. li    schedule 02.02.2016


Ответы (1)


Если recv() возвращает пустую строку, это означает, что соединение было закрыто.

Сокет может быть закрыт либо клиентом, либо сервером. В этом случае, глядя на опубликованный вами код сервера, я почти уверен, что клиент закрывает соединение, возможно, потому, что оно выходит.

В общем случае код вашего сервера должен выглядеть так:

while True:
    data = self.client.recv(self.size)
    if not data:
        # client closed the connection
        break
    message = self.JSON_parser(data)
    ...

Дополнительный совет: длинное сообщение JSON может потребовать более одного вызова recv(). Точно так же recv() может вернуть более одного сообщения JSON.

Обязательно реализуйте буферизацию надлежащим образом. Рассмотрите возможность обернуть сокет в файлоподобный объект и чтение ваших сообщений построчно (при условии, что ваши сообщения разделены символами новой строки).

person Andrea Corbellini    schedule 02.02.2016