Несколько чатов - единственное ли использование портов?Что делать, если есть сотни комнат? - PullRequest
2 голосов
/ 15 апреля 2011

Нужно какое-то направление на это.Я пишу браузерное приложение для чата, однако есть небольшая разница.

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

Кроме того, пространство чата - это не одна строка, а текстовая область, такая как здесь (SO) для ввода вопроса.

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

Я не написал приложение для нескольких чатов.Простой клиент / сервер, где оба взаимодействуют через порт - это то, что я написал.

Итак, вот вопросы
1.) Как пишется приложение для нескольких чатов?Это также основано на портах?
2.) Показывать другим людям каждое нажатие клавиши по мере их ввода, я думаю, возможно через ajax.Есть ли какой-нибудь другой механизм?

Примечание: я собираюсь использовать каркас Python (web2py), но я не думаю, что здесь будет иметь значение каркас.

Любые предложения приветствуются, спасибо!

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Запись в Википедии для Comet (программирование) содержит довольно хороший обзор различных подходов, которые вы можете применить к клиенту (при условии, что ваш клиент - веб-браузер), и эти подходы предлагают правильный дизайн длясервер (при условии, что сервер является веб-сервером).

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

Вы абсолютно не хотите использоватьпорты для этого.Это помещает информацию уровня приложения в транспортный уровень, и это толкает проблемы уровня приложения (приложение собирается создать новую комнату чата) в проблемы уровня транспорта (необходимо открыть новый порт на брандмауэре).

Кроме того, порт - это просто 16-битное поле в заголовке пакета.Вы можете сделать то же самое в дизайне сообщений вашего приложения: поставить идентификатор комнаты и идентификатор пользователя в начале каждого сообщения и заставить сервер разбираться со всем этим.

То, что поражает меня какБеда в том, чтобы выяснить, когда клиент запрашивает обновление, что должно быть отправлено.Наивное решение состоит в том, чтобы сохранить буфер для каждого пользователя в комнате и поддерживать индекс в буфере каждого (другого) пользователя как часть состояния пользователя;таким образом, когда пользователь A запрашивает обновление, сервер может отправить все, что пользователи B, C и D набрали со времени последнего запроса A.Это поднимает все виды вопросов об использовании и сохранении памяти, которые не имеют очевидных простых решений

Правильные ответы на проблемы, которые я здесь обсудил, будут зависеть от ваших требований.Убедитесь, что эти требования определены очень подробно.Вы не хотите, чтобы вы задавали вопросы типа «Должен ли я вместе нажимать клавиши?»пока вы строите эту штуку.

1 голос
/ 15 апреля 2011

Вы можете попробовать сделать что-то вроде IRC, где текущая «комната» отправляется от клиента на сервер «до» текста (/PRIVMSG #room-name Hello World), разделенного пробелом. Например, вы можете отправить ROOMNAME Sample text из браузера на сервер.

Использование AJAX было бы наиболее разумным вариантом. Я никогда не использовал web2py, но, полагаю, вы могли бы просто использовать JSON для анализа данных между браузером и сервером, если вы хотите проявить фантазию.

...