Instant Messaging изнутри

Косякин Антон

Xakep, номер #060, стр. 060-090-4


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

Доползли до второй проблемы - контакт-лист. Здесь опять же два способа реализации. Первый: клиент у себя просто добавляет тех, кто ему нужен, и начинает с ними общаться. И каждые несколько минут клиент узнает у сервера, в онлайне ли эти пользователи. Это самый простой в реализации способ. Он будет кушать много трафика, особенно в больших системах. Поэтому предлагаю альтернативу: при добавлении пользователя в контакт-лист сообщать об этом серверу. И возложить на него ответственность за информирование нас о том, в онлайне наши друзья или нет. Подожди смеяться. Думаю, засмеюсь я, когда ты начнешь это реализовывать. Хе-хе.

Посылка сообщений

Подходим к самой важной части нашего повествования. И заодно к завершающей. Сейчас я поведаю тебе о способах передачи сообщений. Ты будешь смеяться, но здесь опять два возможных варианта решения проблемы. Первый - если твоя система ориентирована на небольшое количество пользователей, а значит, на малый трафик. Все довольно просто - передаешь сообщения только через сам сервер. Т.е. клиент посылает серверу запрос: "Хочу послать вот такое сообщение вот тому юзеру". Сервер принимает его и передает сообщение адресату. При получении адресат сообщает: "Да, все здорово, сообщение получил, всем спасибо". И сервер нам сообщает, что передача прошла успешно, сообщение доставлено. Если же адресат находится в офлайне, то нужно сделать следующее: сервер должен занести передаваемое сообщение в базу данных, а отправителю сообщить, что информация будет ждать получателя, пока он не появится. И как только нужный нам пользователь залогинится в систему - передать ему это архиважное сообщение.

Ну а теперь снова представь, что у тебя в системе тысяча пользователей, и все они хотят общаться. В таком случае, помимо отправки коротких (советую строго ограничить их максимальный размер) сообщений через сервер, придется реализовать и передачу информации клиент-клиент. Основные грабли в этом случае (исключая реализацию) - безопасность. Поэтому советую сделать так: отправитель шлет через сервер запрос клиенту о желании передать сообщение. Адресат отвечает: да или нет. В случае согласия отправитель должен отослать свой IP-адрес и порт. К нему будет подключаться наш адресат для обмена информацией. Конечно, можно поступить проще - сразу спросить у сервера IP-адрес получателя и тут же к нему подключиться. Но кто знает, а вдруг в твою систему проберется банда флудеров-убийц, и они будут таким образом закидывать идиотскими месагами всех твоих клиентов?

Назад на стр. 060-090-3  Содержание  Вперед на стр. 060-090-5