Сервер:
- Apache 2.0
- PHP5
- Mysql5
- PEAR::Service_Json - библиотека для того чтобы можно было работать с данными, упакованными в JSON. С их помощью будет осуществляться обмен данными между клиентом и сервером
- DB_Simple (см. www.dklab.ru) - библиотека для НОРМАЛЬНОЙ работы с базой данных
Клиент:
- Dojo1.0+ - библиотека для работы с AJAX, для красивых визуальных эффектов (впрочем последнее вряд ли понадобится)
- Всё.
2 Принцип действия
Примерно это все должно действовать так.
1. Как читать сообщения
Загрузили страницу. В ней в который будет выводиться история чата. Эдакая консоль.
Кроме того на странице есть форма с текстовым инпутом. И кнопка "отправить".
Будет скрипт который раз в пару секунд будет вызывать функцию readNewMessages() "проверить свежие сообщения".
Что делает функция readNewMessages - она посылает AJAX запрос на сервер. В запросе мы сообщаем: "Я - юзер $такой-то. Последний раз я к тебе обращался $тогда-то. Какие сообщения пришли с тех пор?".
Сервер делает выборку в БД - выбирает все сообщения метка времени которых больше чем $тогда-то.
Сервер формирует ответ - массив сообщений и новую отметку времени.
Клиент, когда к нему пришли сообщения, выводит их в history и запоминает отметку времени самого последнего полученного сообщения. Её то он и спросит в следующем запросе!
2. Фигня это все.
(Пункт 2 рекомендуется читать поняв пункт 1)
Я о том что ИД юзера и отметку времени можно хранить не на клиенте (это довольно небезопасно), а на сервере. Для этого мы используем механизм сессий. А клиенту останется тока залогиниться и передавать каждый раз идентификатор сессии. Да и то об этом мы не будем думать - ведь он хранится в куки. То есть запрос клиента можно перефазировать: "Вот тебе мой ИД сессии. Я сам знаешь кто и мне нужны свежие сообщения с сам знаешь какого момента!"
3. Как посылать сообщения
Вообще фигня. Когда юзер жмет на кнопку "Отправить", вызывается функция которая шлёт AJAX запрос на сервак со словами (мы условились работать на сессиях - см. пункт 2) "Я сам знаешь кто. Вот моё $сообщение."
Сервак пишет сообщение в базу данных и говорит "принято" или "ошибка".
Как тока от сервака приходит ответ "принято", мы очищаем текстовый инпут давая юзеру понять что ему можно посылать новый бред.
3. Детали реализации
1. Протокол
На сервере есть скрипт server.php. Он принимает AJAX запросы в формате JSON
{
action: 'какая то команда',
data:
{
...какие то аргументы этой команды
}
}
и отвечает:
{
result: 'статус ответа - ok или error',
data:
{
...данные которые сервер отвечает клиенту
}
}
В action мы пишем что за команду хотим выполнить, data - это ее аргументы.
Сервер отвечает: response - это статус и data - данные которые вернул сервер.
action может быть login, read, write.
responce может быть ok или error
1)login - сообщаем серверу своё имя (для простоты пароля не надо и юзеры нигде не хранятся)
Пример:
{
action:'login',
data:
{
'name':'vasya'
}
}
сервер отвечает
{
result:'ok',
data:
{
'greeting':'Добро пожаловать, vasya!'
}
}
2)read - просим сервер сообщить свежие сообщения
Пример:
запрос
{
action: 'read'
}
ответ
{
result:'ok',
data:
{
messages:
[
1:
{
time:8299888656574,
user:'Vovka',
text:'Че за нахъ?'
}
2:
{
time:8299888656580,
user:'DarkAngel',
text:'В бОбруЙск жевотнае!!!!'
}
]
}
}
3)write - посылаем свой месседж на сервер
Пример:
запрос
{
action: 'write',
data:
{
message: 'Уйду я от вас злые вы...'
}
}
ответ
{
result: 'ok'
}
2. Сервер читает JSON строку и разлагает ее на PHP объекты с помощю класса Service_Json.
Потом смотрит что за action и вызывает в своем классе метод, имя которого равно переменной action, передавая ему параметром переменную data.
Как то так:
class Chat_Server
{
...
//запуск класса
public function serve()
{
$q = $_POST['q'];// получили строку АЯКС запроса
$json = new Service_Json();//создали JSON декодер
$requestObject = $json->decode($q);
$method = $q->action;
$args = $q->data;
$this->$method($args); //вызвали у себы тот метод, имя которого совпадает с переменной action полученной в запросе
}
public function read($args)
{
//читаем сообщения из базы и возвращаем результат
}
public function write($args)
{
//пишем сообщение юзера в базу
}
public function login($args)
{
//стартуем пользовательскую сессию
}
...
}
//создали класс сервера
$myServer = new Chat_Server();
//обслужили запрос
$myServer->serve();
?>
Я тут очертил скелет сервера. Пока нет функции ответа клиенту и я не уверен что не напутал ничего...
Комментариев нет:
Отправить комментарий