Запись в Википедии для Comet (программирование) содержит довольно хороший обзор различных подходов, которые вы можете применить к клиенту (при условии, что ваш клиент - веб-браузер), и эти подходы предлагают правильный дизайн длясервер (при условии, что сервер является веб-сервером).
Одна вещь, которая не упомянута на этой странице, но о которой вы почти наверняка захотите подумать, это буферизация ввода на клиенте.Я не думаю, что преждевременная оптимизация заключается в том, чтобы учесть, что многопользовательское приложение, в котором нажатие клавиш каждого пользователя попадает на сервер, будет плохо масштабироваться.Я хотел бы рассмотреть возможность нажатия клавиш пользователя в буфер на стороне клиента, и отправлять их на сервер только тогда, когда пользователь ничего не набрал в течение 500 миллисекунд или около того.
Вы абсолютно не хотите использоватьпорты для этого.Это помещает информацию уровня приложения в транспортный уровень, и это толкает проблемы уровня приложения (приложение собирается создать новую комнату чата) в проблемы уровня транспорта (необходимо открыть новый порт на брандмауэре).
Кроме того, порт - это просто 16-битное поле в заголовке пакета.Вы можете сделать то же самое в дизайне сообщений вашего приложения: поставить идентификатор комнаты и идентификатор пользователя в начале каждого сообщения и заставить сервер разбираться со всем этим.
То, что поражает меня какБеда в том, чтобы выяснить, когда клиент запрашивает обновление, что должно быть отправлено.Наивное решение состоит в том, чтобы сохранить буфер для каждого пользователя в комнате и поддерживать индекс в буфере каждого (другого) пользователя как часть состояния пользователя;таким образом, когда пользователь A запрашивает обновление, сервер может отправить все, что пользователи B, C и D набрали со времени последнего запроса A.Это поднимает все виды вопросов об использовании и сохранении памяти, которые не имеют очевидных простых решений
Правильные ответы на проблемы, которые я здесь обсудил, будут зависеть от ваших требований.Убедитесь, что эти требования определены очень подробно.Вы не хотите, чтобы вы задавали вопросы типа «Должен ли я вместе нажимать клавиши?»пока вы строите эту штуку.