websocket是HTML5的一種新的通信協議,它是實現了瀏覽器與服務器的雙向通訊。在 WebSocket API 中,瀏覽器和服務器只需要要做一個握手的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。
關于websocket的更多信息,請移步維基百科
在客戶端使用websocket需要創建WebSocket對象,通過提供的open、send、message、close等方法實現創建、發送、監聽信息、關閉連接。例如下面的代碼:
if('WebSocket' in window){ // 創建websocket實例 var socket = new WebSocket('ws://localhost:8080'); //打開 socket.onopen = function(event) { // 發送 socket.send('I am the client and I'm listening!'); // 監聽 socket.onmessage = function(event) { console.log('Client received a message',event); }; // 關閉監聽 socket.onclose = function(event) { console.log('Client notified socket has closed',event); }; // 關閉 //socket.close() };}else{ alert('本瀏覽器不支持WebSocket哦~');}
現在chrome、firefox等瀏覽器都已經支持了websocket,而IE卻沒有。下面我們來簡單說說服務器端對websocket的支持。
服務器端支持websocket的語言不少,而且都有相關的開源項目,例如php的phpwebsockets:http://code.google.com/p/phpwebsockets/,java的jWebsocket:http://jwebsocket.org/。
更多的信息可以瀏覽這篇文章:Start Using HTML5 WebSockets Today
socket.IO是一個websocket庫,包括了客戶端的js和服務器端的nodejs。官方地址:http://socket.io
去github clone socket.io的最新版本,或者直接飲用使用socket.io的CDN服務:
<script src="http://cdn.socket.io/stable/socket.io.js"></script>
下面可以創建使用socket.io庫來創建客戶端js代碼了:
var socket = io.connect('http://localhost');socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' });});
socket.on是監聽,收到服務器端發來的news的內容,則運行function,其中data就是請求回來的數據,socket.emit是發送消息給服務器端的方法。
socket.io不僅可以搭建客戶端的websocket服務,而且支持nodejs服務器端的websocket。
使用node插件管理包,運行下面的命令就可以安裝成功socket.io
npm install socket.io
沒有npm的或者windows用戶可以使用github下載socket.io并且放入到node_modules文件夾中,具體配置可以參考文章:《nodejs教程:配置nodejs.exe的windows目錄結構》
通過nodejs的http模塊就可以方便的搭建websocket服務器環境,例如下面的代碼:
// 引入需要的模塊:http和socket.iovar http = require('http'), io = require('socket.io');//創建servervar server = http.createServer(function(req, res){ // Send HTML headers and message res.writeHead(200,{ 'Content-Type': 'text/html' }); res.end('<h1>Hello Socket Lover!</h1>');});//端口8000server.listen(8080);//創建socketvar socket = io.listen(server);//添加連接監聽socket.on('connection', function(client){ //連接成功則執行下面的監聽 client.on('message',function(event){ console.log('Received message from client!',event); }); //斷開連接callback client.on('disconnect',function(){ console.log('Server has disconnected'); });});
保存為socket.js然后在命令行執行:node socket.js 即可啟動服務器,現在訪問localhost:8000就可以了。
前篇文章我提到了nodejs的web框架:express,下面的代碼就可以創建一個基于express和socket.io的socket應用:
var app = require('express').createServer(), io = require('socket.io').listen(app);app.listen(80);app.get('/', function (req, res) { res.sendfile(__dirname + '/index.html');});io.sockets.on('connection', function (socket) { //發送消息給客戶端 socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); //廣播信息給除當前用戶之外的用戶 socket.broadcast.emit('user connected'); //廣播給全體客戶端 io.sockets.emit('all users');});
和客戶端的方法一樣,socket.io的監聽都是使用on方法,發送使用emit方法。另外提供了廣播功能:broadcast
最近寫文章比較勤,主要是怕自己十一放假回來頭緒就亂了,所以在十一之前整理出來最近胡亂學習nodejs的一些心得體會,國內的nodejs資料太少了,學習成本挺高的。
前天晚上寫的一個基于express+socket.io的聊天室已經放到了網上,歡迎大家下載測試。
下篇文章可能要寫在express和socket.io中實現session認證。因為上面的聊天室用到了session判斷用戶是否登錄。另外自己寫了個nodejs的斗地主,可是邏輯相當的復雜,于是代碼也就越寫越爛,寫到最后測試邏輯就開始混淆,有空還要整理下才能放出來哦~省的拿出去丟人。羞愧啊~
來源:http://www.js8.in/784.html