Я боролся с сокетами, добивался успехов, но продолжаю сталкиваться с проблемами и чувствую, что должен делать что-то не так, чтобы все было так сложно.
Существует множество обучающих программ, которые реализуют TCP-клиент и сервер, обычно где:
- Сервер работает в бесконечном цикле, прослушивая и возвращая данные клиентам.
- Клиент подключается к серверу, отправляет сообщение, получает то же самое обратно, , а затем выходит .
Это я могу справиться. Однако, похоже, никто не вдавался в подробности того, что вы должны и не должны делать с последовательной связью между одними и теми же двумя машинами / процессами.
Я следую общей последовательности вызовов функций для выполнения нескольких сообщений, но для того, чтобы задать реальный вопрос, вот некоторые ограничения:
- Каждое событие будет одним клиентом-> сервером и ответом в виде одной строки.
- Сообщения довольно короткие, скажем, не более 100 символов.
- События происходят относительно медленно, максимум, скажем, 1 раз в 5 секунд, но обычно меньше, чем половина этой скорости.
и некоторые конкретные вопросы:
- Должен ли сервер закрывать соединение после своего ответа или пытаться удержать соединение до следующего соединения?
- Аналогично, должен ли клиент закрывать соединение после получения ответа или попытаться повторно использовать соединение?
- Означает ли замкнутое соединение (либо через
close()
, либо из-за какой-либо ошибки) конец сеанса связи или конец срока службы всего объекта?
- Можно ли повторно использовать объект, подключившись снова?
- Можно ли сделать это на одном и том же порту сервера?
- Или мне нужно заново создать другой объект сокета с новым вызовом
socket.socket()
?
- Что я должен делать, чтобы избежать ошибок "адрес используется"?
- Если время ожидания
recv()
истекло, можно ли повторно использовать гнездо или я должен выбросить его? Опять же, могу ли я установить новое соединение с тем же объектом сокета, или мне нужен совершенно новый сокет?