Я изучаю сетевое программирование и хочу создать простую P2P-сеть на основе TCP-соединения.
Пока у меня есть сервер, который принимает подключения от клиентов (TCP). Клиенты знают о начальном местоположении сервера.
Это мои вопросы:
Как сервер может уведомлять клиентов друг о друге? это просто отправка списка IP-адресов всех тел всем?
Если все клиенты работают на одном компьютере (например, 127.0.0.1), нужно ли им использовать разные номера портов при соединении друг с другом?
Если я хочу поддерживать TCP-соединение, как коллеги решают, кто будет клиентом, а кто — сервером в каждой паре? Возможно, это можно сделать на стороне сервера, когда он отправляет информацию клиентам.
Я предполагаю, что TCP-соединение не является идеальным в этом сценарии, по крайней мере, по той причине, что клиенты должны поддерживать отдельное соединение для каждого узла в сети. Хотя это скорее тренировочное упражнение, и я ищу надежное соединение, где мне не приходится сталкиваться с возможностью потери или сбоя некоторых пакетов. (на данном этапе:).
Спасибо!
Что касается первого вопроса, это зависит от вашего дизайна, но информирование подключенных клиентов о других клиентах через регулярные промежутки времени является одним из способов сделать это.
Что касается второго вопроса, если клиент также должен выступать в качестве сервера для других клиентов, у них нет выбора, так как каждый клиент должен привязаться к локальному адресу (пара ip-адрес / номер порта) и если один порт на конкретный IP-адрес используется, тогда вы должны выбрать другой. Это можно автоматизировать, установив порт в ноль при привязке, и операционная система выберет порт для вас.
Что касается третьего вопроса, почему клиент не может быть и клиентом, и сервером? Клиенты подключаются к центральному серверу, который отслеживает всех клиентов в сети и, вероятно, также обрабатывает запросы от клиентов. Когда центральный сервер получает запрос, он отправляет его всем другим подключенным клиентам и отвечает запрашивающему клиенту о том, что другие клиенты имеют, что он ищет. Затем исходный клиент подключается к другим клиентам, у которых есть все, что он искал, а затем эти клиенты действуют как серверы для исходного клиента.
Что-то вроде этого:
Теперь клиенты B и D действуют как клиенты и как серверы. Это также решает вашу первую проблему, поскольку сервер отправляет информацию о других клиентах только при необходимости.