уже стоит в пачке хотфиксов на сервере и клиенте) здесь только основная логика, без всяких плюшек, проверок и ограничений. думал накатать список в продолжении (судя по реакции аудитории не таком уж и нужном, но дело надо доводить до логического конца...).
Наверно, я не смогу передать словами, почему именно Socket.IO, но посмотрите на это:
Websockets:
var socket = new Websocket('http://example.com/');
socket.on('connect', function() {});
socket.on('message', function() {});
Socket.IO:
var socket = new io.socket('http://example.com/'); // до версии 0.7.x
socket.on('connect', function() {});
socket.on('message', function() {});
KnockoutJS + NowJS
var chatRoom = ko.liveModel({
messages: ko.observableArray([]),
send: function() {
chatRoom.messages.push({text: this.text()});
ko.save({ overwrite: true, ignore: [«text»]});
},
text: ko.observable()
}); // и так далее
Пожалуй, я неверно выразился. С минимумом синтаксического сахара. ko.liveModel() — немного не нативная функция. Вы б хоть и мой пост прочитали) И периодически изобретать велосипед таки полезно.
Меньше кода писать? Возможно. Больше кода в подключаемых библиотеках? Да.
Конечно, можно написать свою высокоуровневую библиотеку, в которой чат вообще будет реализован функцией addChat(). Но надо ли? Я хотел написать на чистом JS — не срослось, Socket.IO — имхо, ближе всего по логике к чистому языку.
Сердечное спасибо!)
С точки зрения пользователя — весь интернет это шайтан-машина. Им не нужно знать как это работает, почему, как делалось etc — пользователю главное, чтоб работало.
Когда нет websocket — в ход идет XmlHttpRequest-polling. Не думаю, что что-то сверхсложное. Если любопытно, могу полазить по исходникам, расписать.
Справа список пользователей, их количество etc. У меня пока была идея выводить список в чат по команде /userlist (или какой-то в этом роде), но ваша реализация лучше — лог не засоряется.
Потому что конкретно на Socket.IO на хабре еще не было? И да, мне инвайт (куча интересных статей лежит в закрытых блогах, неизвестно почему) и опыт (когда тестируешь сам — в голову не придет спамить пустыми строками каждую секунду), серверу — нагрузочное тестирование, троллям — радость.
Или вы имеете что-то против троллей?
Собственно, чем не нравится чат? Это основа для всего, любое общение клиента с сервером — обмен пакетами, сейчас обмениваемся текстовыми сообщениями, завтра меняем в коде 10 строчек и привязываем к игрушке/рисовалке/документам/календарю чему там еще…
Кол-во соединений/пользователей пока не считал, хотя на тестовом сервере есть. В следующей статье будет. Кстати, на chat.websockets.ru хорошо сделано, может сппозаимствовать идею?..
Железо — тучка от Selectel'а, 32-битный Lycid Lynx Ubuntu, 168-512 оперативки (сейчас 260), 8 ядер.
Апач работает в режиме «apt-get — vim virtualhosts — PROFIT!» — я больше программист нежели администратор) впрочем, все вебсокеты идут на node, с апачем они на разных портах и не пересекаются. emit — в самой программе не используются, т.к. пришлось бы на каждый event писать свой обработчик, я пробовал так делать — куча повторяющегося кода.
А, мой косяк, понял. Пытался по-быстрому пофиксить баг с отправкой пустых строк — поставил регэксп на вхождение печатных символов, а про кириллицу забыл. Возможно, это. Сейчас подправлю код, через пару минут перезагрузите страницу.
Если времени — то «мин», если размер — то «Мб». А то, право слово, странновато смотрится)
С праздником, Владивосток! А мне еще 3 часа ждать :)
Websockets:
var socket = new Websocket('http://example.com/');
socket.on('connect', function() {});
socket.on('message', function() {});
Socket.IO:
var socket = new io.socket('http://example.com/'); // до версии 0.7.x
socket.on('connect', function() {});
socket.on('message', function() {});
KnockoutJS + NowJS
var chatRoom = ko.liveModel({
messages: ko.observableArray([]),
send: function() {
chatRoom.messages.push({text: this.text()});
ko.save({ overwrite: true, ignore: [«text»]});
},
text: ko.observable()
}); // и так далее
Конечно, можно написать свою высокоуровневую библиотеку, в которой чат вообще будет реализован функцией addChat(). Но надо ли? Я хотел написать на чистом JS — не срослось, Socket.IO — имхо, ближе всего по логике к чистому языку.
С точки зрения пользователя — весь интернет это шайтан-машина. Им не нужно знать как это работает, почему, как делалось etc — пользователю главное, чтоб работало.
Когда нет websocket — в ход идет XmlHttpRequest-polling. Не думаю, что что-то сверхсложное. Если любопытно, могу полазить по исходникам, расписать.
Или вы имеете что-то против троллей?
сппозаимствовать идею?..Железо — тучка от Selectel'а, 32-битный Lycid Lynx Ubuntu, 168-512 оперативки (сейчас 260), 8 ядер.
Апач работает в режиме «apt-get — vim virtualhosts — PROFIT!» — я больше программист нежели администратор) впрочем, все вебсокеты идут на node, с апачем они на разных портах и не пересекаются. emit — в самой программе не используются, т.к. пришлось бы на каждый event писать свой обработчик, я пробовал так делать — куча повторяющегося кода.