HTTP 協議能夠總結幾個特色:javascript
TCP 協議能夠總結幾個特色:前端
WebSocket 目前由 W3C 進行標準化。WebSocket 已經受到 Firefox 四、Chrome 四、Opera 10.70 以及Safari 5 等瀏覽器的支持。
若是在前端咱們能夠把 AJAX 請求看成一個 HTTP 協議的實現,那麼,WebSocket 就是 TCP 協議的一種實現。java
npm install ws
var socketServer = require('ws').Server; var wss = new socketServer({ port: 8080 });
var app = require('express')(); var server = require('http').Server(app); var socketServer = require('ws').Server; var wss = new socketServer({server: server, port: 8080});
wss.on('connection', function (client) { client.on('message', function (_message) { var _messageObj = JSON.parse(_message); //status = 1 表示正常聊天 _messageObj.status = 1; this.message = _messageObj; //把客戶端的消息廣播給全部在線的用戶 wss.broadcast(_messageObj); }); // 退出聊天 client.on('close', function() { try{ this.message = this.message || {}; // status = 0 表示退出聊天 this.message.status = 0; //把客戶端的消息廣播給全部在線的用戶 wss.broadcast(this.message); }catch(e){ console.log('刷新頁面了'); } }); }); //定義廣播方法 wss.broadcast = function broadcast(_messageObj) { wss.clients.forEach(function(client) { client.send(JSON.stringify(_messageObj)) }); };
if(!WebSocket){ $('.connState').text("您的瀏覽器不支持WebSocket"); return false; } //鏈接 socket 服務器 var socket = new WebSocket('ws://localhost:8080');
//監聽 socket 的鏈接 socket.onopen = function(){ $('.connState').text("服務已鏈接 ws://localhost:8080"); }
//監聽服務端斷開 socket.onclose = function(){ $('.connState').text("服務已斷開"); socket = null; }
socket.close();
//監聽服務端異常 socket.onerror = function(){ $('.connState').text("服務錯誤"); socket = null; }
//監聽服務端廣播過來的消息 socket.onmessage = function(msg){ var msgObj = JSON.parse(msg.data); if(msgObj.status == 0){ $('<p>' + msgObj.nickname + '[' + msgObj.time + ']退出聊天</p>').appendTo('.msgList'); } else{ $('<p>' + msgObj.nickname + '[' + msgObj.time + ']:' + msgObj.message + '</p>').appendTo('.msgList'); } }
var sendMessage = function(_mess){ if(socket){ var myDate = new Date(); var now = myDate.getMonth() + '-' + myDate.getDate() + ' ' + myDate.getHours() + ':' + myDate.getMinutes() + ':' + myDate.getSeconds(); var mesObj = { nickname: $('#nickName').val(), message: _mess || $('#mesBox').val(), time: now } //向服務端發送消息 socket.send(JSON.stringify(mesObj)); } }
該案例是一個多人聊天室node
運行步驟express
案例思路npm
new socketServer({port: 8080});
var socket = new WebSocket('ws://localhost:8080');
socket.send('加入聊天');