消息推送
- Server-Sent Events(SSE) 允許服務(wù)端推送數(shù)據(jù)到客戶端:性能較好、實(shí)時(shí)性較強(qiáng),但存在一定的兼容性問題,由于是在HTML5中提出的標(biāo)準(zhǔn),IE全系瀏覽器都不支持,并且原生手機(jī)應(yīng)用也沒有提供支持。
- comet技術(shù)
- HTTP輪詢
- nodejs socket實(shí)現(xiàn)實(shí)時(shí)消息推送
在nodejs中主要牽涉到的模塊:(net及net readline)
var net = require('net');
var server = net.createServer((socket) => { var time = getTime();
//加入一個(gè)標(biāo)志
//加入到客戶列表中
var name = clients.add( socket );
//接收客戶發(fā)過來的信息 socket.on('data', function(data) {
// guangbo(data, socket);
// 接受來自客戶端的信息
console.log('收到數(shù)據(jù)啦---' );
console.log(data.toString());
//發(fā)送給所有人
clients.sendAll(socket,data);
});
//客戶關(guān)閉了連接
socket.on('close', function(data) {
console.log('客戶走了~: ' + socket.remoteAddress + ' ' + socket.remotePort);
//刪除客戶
clients.del(socket);
//發(fā)送給所有人
clients.sendAll(socket, '有人走了!當(dāng)前聊天人數(shù):' + clients.length());
});
console.log('有人連了,客戶端數(shù)量:'+ clients.length() );
console.log('有人連了,客戶端數(shù)量:'+ clients.length() );
socket.write(time +' 歡迎進(jìn)來聊天~ ' + name + '!\n' + '當(dāng)前聊天人數(shù):' + clients.length());
clients.sendAll(socket, '有人進(jìn)來了!當(dāng)前聊天人數(shù):' + clients.length());
}).on('error', (err) => {
// handle errors here
throw err;
});
clients = new Object();
clients.list = [];
clients.sendAll = function(socket,data){
console.log('開始發(fā)送給全部人啦!!');
for(var i=0 ; i < this.list.length ; i++){
if(socket !== this.list[i]){
var o = this.list[i];
//檢查socket是否可以寫
if (o.writable) {
console.log('發(fā)送給:' + o.name);
o.write('-----\n' + getTime() + '\n' + socket.name + '說:\n');
o.write(data); o.write('-----'); } else { console.log('socket 失效了:' + o.name);
//socket斷開了什么的,就不能發(fā)送啦,需要?jiǎng)h除這個(gè)連接
this.del(o);
}
}
}