Как управлять несколькими сеансами клиента в серверном приложении? - PullRequest
1 голос
/ 13 ноября 2009

Я пишу приложение для веб-чата, похожее на GTalk. Он основан на Orbited + Sinatra для клиентской стороны и Ruby для серверной. Я уже реализовал весь протокол, все работает хорошо. Но. У меня проблема - не знаю, как бороться, если есть несколько подключений от одного пользователя. Скажем, например, я вошел в чат из 2 разных браузеров. Google отлично справляется, два чата выглядят одинаково. Но мое приложение просто показывает 2 одинаковых пользователей в списке контактов, что неверно.

Вот небольшой пример клиентского пула серверов:

Server
--> Connections
      |
      - Client (User Information, ConnectionID)
      - Client (User Information, ConnectionID)
      ....
      - Client (...)

У меня есть 2 типа сообщений: личное (от пользователя к пользователю), общедоступное (от пользователя к конференции).

Я пытаюсь выяснить, как справиться с такой ситуацией? Какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2009

Когда ваши клиенты подключаются, вы должны дать им уникальный идентификатор. Классический ASP имел это SessionID, но вам просто нужно что-то уникальное, возможно, отправив этот ключ клиенту через cookie.

После этого любое сообщение, отправленное клиентами, должно быть помещено в общую область; опять же в классическом ASP у вас были Application объекты, прекрасно подходящие для этой задачи.

Отсюда вы можете идти куда угодно: создавать чаты, фильтровать сообщения, что-то шептать и т. Д.

Я делал что-то подобное около 7, 8 лет назад, сохраняя сообщения в файлах XML. Но вы также можете использовать некоторую базу данных для этого.

В качестве псевдокода у вас будет следующее для каждого веб-запроса:

    if request DON'T have cookie ID
       create an unique ID and set cookie

    process incoming action
       case "private":
            write message for that unique id
       case "public"
            write message without target user
       case ...

    display user interface
        list all messages for your unique id, or without target
        create a users list, using unique IDs as value (except yours)

    refresh every n seconds

0 голосов
/ 13 ноября 2009

Извините за расплывчатый ответ, но здесь идет речь: вам нужно «выталкивать» текст чата в каждое соединение для данного идентификатора пользователя, а не просто отвечать на «извлечение» из данного соединения / сеанса.

Я не знаю, как работает ваш клиент, но если он запрашивает обновления, вам, вероятно, нужно сохранить в базе данных изображение последних сообщений для каждого пользователя, а затем получить все соответствующие обновления для этого пользователя из БД, а не просто связывать чат с сеансами «точка-точка».

Grr. У меня нет времени, чтобы объяснить это лучше сейчас ...

        • обновление: - - - - -

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

В качестве комментария к самому вопросу: кто-то высказал мнение, что «это было сделано», загрузите код. Возможно, это верный момент, а может и нет. Если вы можете найти существующую кодовую базу в форме, которую вы можете охватить и расширить, прекрасно. Если нет (потому что это домашнее задание или потому что корпоративная политика гласит: «делай это с нуля, здесь и сейчас», то, значит, загрузка «решения» не является действительной критикой, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...