Какова правильная процедура для нескольких последовательных коммуникаций через сокет? - PullRequest
3 голосов
/ 15 августа 2011

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

Существует множество обучающих программ, которые реализуют TCP-клиент и сервер, обычно где:

  • Сервер работает в бесконечном цикле, прослушивая и возвращая данные клиентам.
  • Клиент подключается к серверу, отправляет сообщение, получает то же самое обратно, , а затем выходит .

Это я могу справиться. Однако, похоже, никто не вдавался в подробности того, что вы должны и не должны делать с последовательной связью между одними и теми же двумя машинами / процессами.

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

  • Каждое событие будет одним клиентом-> сервером и ответом в виде одной строки.
  • Сообщения довольно короткие, скажем, не более 100 символов.
  • События происходят относительно медленно, максимум, скажем, 1 раз в 5 секунд, но обычно меньше, чем половина этой скорости.

и некоторые конкретные вопросы:

  1. Должен ли сервер закрывать соединение после своего ответа или пытаться удержать соединение до следующего соединения?
  2. Аналогично, должен ли клиент закрывать соединение после получения ответа или попытаться повторно использовать соединение?
  3. Означает ли замкнутое соединение (либо через close(), либо из-за какой-либо ошибки) конец сеанса связи или конец срока службы всего объекта?
    1. Можно ли повторно использовать объект, подключившись снова?
    2. Можно ли сделать это на одном и том же порту сервера?
    3. Или мне нужно заново создать другой объект сокета с новым вызовом socket.socket()?
  4. Что я должен делать, чтобы избежать ошибок "адрес используется"?
  5. Если время ожидания recv() истекло, можно ли повторно использовать гнездо или я должен выбросить его? Опять же, могу ли я установить новое соединение с тем же объектом сокета, или мне нужен совершенно новый сокет?

1 Ответ

2 голосов
/ 15 августа 2011
  1. Если вы знаете, что скоро снова начнете общаться между двумя процессами, нет необходимости закрывать соединение.Если вашему серверу приходится иметь дело и с другими соединениями, вы хотите сделать его многопоточным.
  2. То же самое.Вы знаете, что оба должны делать одно и то же, верно?
  3. Вы должны создать новый сокет на клиенте, и вы также не можете повторно использовать сокет на стороне сервера: вы должны использовать возвращенный новый сокетна следующий (clientsocket, address) = serversocket.accept() звонок.Вы можете использовать тот же порт.(Подумайте о веб-серверах, они всегда принимают подключения к одному и тому же порту от тысяч клиентов)

В обоих случаях (закрытие или закрытие) у вас должен быть, однако, знак завершения сообщения, например:\n.Затем вы должны читать из розетки, пока не дойдете до знака.Такое использование настолько распространено, что python имеет конструкцию для этого: socket.makefile и file.readline

ОБНОВЛЕНИЕ:

  1. Опубликовать код.Возможно, вы неправильно закрыли соединение.
  2. Вы можете снова вызвать recv ().

ОБНОВЛЕНИЕ 2: Никогда не предполагайте, что соединение надежное, но включайте механизмы для повторного подключения в случае ошибок.Поэтому можно попытаться использовать одно и то же соединение, даже если есть более длинные промежутки.Что касается ошибок, которые вы получаете: если вам нужна конкретная помощь для вашего кода, вы должны опубликовать небольшие (но полные) примеры.

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