這是Node.js最常用到的套件,Socket.io的優點就是可以達到Server push的效果,且其中連線是使用handshake,如果要做一些與使用即時互動的功能,使用socket.io是最適合不過的(socket.io source)
安裝
npm install socket.io
使用範例
Server side
//Express 3.x
var express = require('express');
var app = express();
var server = require('http').createServer(app)
var io = require('socket.io').listen(server);
//listen port
server.listen(1234);
//.on()為socket的接收端,預設的key值是connection
io.sockets.on('connection', function (socket) {
//接收key值為set nickname的socket,並傳入一個變數name
socket.on('set nickname', function (name) {
//.set()為設定socket中的暫存變數,當同個變數內容使用範圍不止在這個區域時可以使用,可同時帶入function執行動作
socket.set('nickname', name, function () {
//.emit()為socket的發送端
socket.emit('ready', name);
});
//.get()為取得socket中暫存的變數
socket.get('nickname', function(error, name) {
console.log(name);
});
});
});
Client side
<script src="//IP:1234/socket.io/socket.io.js"></script>
//連接伺服器端的socket.io
var socket = io.connect('http://120.119.29.125:1234');
//.on()為socket的接收端,client端預設的key值是connect
socket.on('connect', function () {
//.emit()為socket的發送端
socket.emit('set nickname', prompt('你的名字?'));
//.on()為socket的接收端
socket.on('ready', function ( name ) {
//do something
});
});
Server Broadcast(發送給其他在線上的socket)
//將emit()改成broadcast.emit()即可 (注意,該broadcast自己會收不到)
socket.broadcast.emit('user connected','test');
//broadcast全部,包括自己
io.sockets.emit('user connected','test');
Authorization
socket.io也可以從 handshake Object 取得一些連線資料 (參考文件)
io.sockets.on('connection', function (socket) {
console.log(socket.handshake);
});
handshake Object 格式
{
headers: req.headers // <Object> the headers of the request
, time: (new Date) +'' // <String> date time of the connection
, address: socket.address() // <Object> remoteAddress and remotePort object
, xdomain: !!headers.origin // <Boolean> was it a cross domain request?
, secure: socket.secure // <Boolean> https connection
, issued: +date // <Number> EPOCH of when the handshake was created
, url: request.url // <String> the entrance path of the request
, query: data.query // <Object> the result of url.parse().query or a empty object
}
利用configure統一做一些處理
io.configure(function () {
io.set('authorization', function (handshakeData, callback) {
var ip = handshakeData.address.address;
if (ip == '127.0.0.1') {
//自訂handshakeData內容
handshakeData.username = "Localhost";
} else {
handshakeData.username = "Johnson";
}
callback(null, true); // error first callback style
});
});
io.sockets.on('connection', function (socket) {
//handshake
console.log(socket.handshake.username);
});