Итак, в настоящее время у вас есть система, в которой каждый клиент в локальной сети объявляет себя через UDP для остальной части локальной сети.Одно из клиентских приложений - это «сервер», обладающий некоторыми дополнительными полномочиями по управлению и управлению, помимо того, что он сам по себе является клиентом.
Это, конечно, не новая идея.То, что вы хотите, это добавить некоторые дополнительные разговоры во время начального соединения «здесь я».Когда новый клиент выкрикивает «здесь я» остальной части локальной сети, если есть сервер, сервер должен сказать «Добро пожаловать, я сервер», и новое клиентское приложение теперь знает, какой клиент действует каксервер.Все остальные клиенты, вероятно, также должны сказать «привет».Если сервера нет, новый клиент должен сначала повторить «привет» (в конце концов, это UDP; нужно ожидать, что некоторые сообщения не будут получены), и если никто не отвечает, этот новый клиент является единственным насеть и является «сервером» по умолчанию.Если есть другие, но никто не претендует на роль сервера, клиенты могут «обсудить между собой», чтобы определить новый сервер.
В дополнение к этому, серверная копия должна периодически (возможно, каждые 3-5 секунд).) кричать "я все еще здесь" всем;это называется «сердцебиение» и является очень распространенной альтернативой двухстороннему методу проверки «ping».
Если приложение сервера (или любая копия, действительно) закрывается нормально, оно должно выкрикнутьиз "прощай всем, выясни, кто следующий сервер".Затем оставшиеся клиенты могут обсудить между собой.Если клиент, выступающий в роли сервера, выходит из строя, клиенты пропускают «сердцебиение» на сервере, спрашивают «кто сервер», и, если никто не отвечает, клиенты будут обсуждать между собой.
Теперь клиенты обсуждают средисами по себе »могут быть такими же простыми или сложными, как вам нравится.Самым простым было бы то, чтобы любой клиент сказал «ОК, я теперь сервер», чтобы стать сервером.Возможно, вам придется включить какое-то время в сообщение, чтобы, если другой компьютер сказал это одновременно, клиенты могли сказать: «Хорошо, клиент 15 сказал это первым, поэтому мы пойдем с ним».Клиенты могут «голосовать»;пусть каждый клиент говорит со всеми остальными, чтобы определить номинальную задержку между этим клиентом и всеми остальными, и этот клиент будет «голосовать» за соединение с минимальной задержкой (ни один клиент не может голосовать за себя, если он не обнаружит, что он единственный).Большинство голосов побеждает.
Или сервер может в рамках своего сообщения «пульса» сказать «если я выйду из строя, мой преемник - клиент Х»;и если пропущено сердцебиение, а последующие сообщения от клиентов «вы все еще здесь, сервер» не отвечают, клиенты могут сказать: «Король мертв! Да здравствует King Client X!».
Поймите, что по необходимости, этот уровень управления в системе, состоящей из всех клиентов, при выборе «авторитетного» клиента, который станет сервером, значительно увеличит сложность взаимодействия с клиентом.Кроме того, в то время как использование вами протокола UDP обеспечивает быструю связь, сообщения UDP конфликтуют ВСЕ ВРЕМЯ;если вы разговариваете, когда разговаривает другой человек, ваши сообщения сталкиваются.Таким образом, я бы рекомендовал использовать TCP вместо UDP для большинства коммуникаций в этом программном обеспечении, в которых необходимо, чтобы конкретный клиент был услышан.Это любой прямой опрос клиента («вы все еще там, сервер?»), Какой бы процесс вы ни использовали, чтобы клиенты решали, кто новый сервер и т. Д. И т. Д.