Как заставить TCP-соединение оставаться в живых как можно дольше для получения данных - PullRequest
0 голосов
/ 26 апреля 2019

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


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

Это основной код моего сервера:

def main():
    with socket(AF_INET, SOCK_STREAM) as s:
        s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        address = ('', 7788)
        s.bind(address)
        s.listen()
        while True:
            print('WAITING FOR CONNECTIONS...')
            newConn, newAddr = s.accept()
            with newConn:
                print('%s CLIENT ACCEPTED...' % newAddr[0])
                p = Process(target=recv, args=(newConn, newAddr))
                p.start()

def recv(newConn, newAddr):
    while True:
        recvData = newConn.recv(1024)
        if len(recvData) > 0:
            dataprocessing(recvData)
        else:
            print('%s CLIENT DISCONNECTED' % newAddr[0])
            break

Я надеюсь, что каждое соединение может оставаться в живых как можно дольше, чтобы получать новые данные от клиента в любое время. Почему мой сервер не работает? Стоит отметить, что когда соединение казалось мертвым, оно не получало новых данных для обработки и не печатало информацию «CONNECTION DISCONNECTED». Почему это?

1 Ответ

2 голосов
/ 26 апреля 2019

Попробуйте установить время ожидания вместе с улучшенным механизмом обработки исключений и переподключения. Вы также должны обратиться к setblocking .

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