1.首先io.sockets.on函數接受字符串"connection"作為客戶端發起連接的事件,當連接成功后,調用帶有socket參數的回調函數。我們在使用socket.IO的時候,基本上都在這個回調函數里面處理用戶的請求。
app.get('/', function (req, res) { res.sendfile(__dirname + '/index.html');}); io.sockets.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('other event', function (data) { console.log(data); }); });
2.socket最關鍵的是emit和on兩個函數,前者提交(發出)一個事件(事件名稱用字符串表示),事件名稱可以自定義,也有一些默認的事件名稱,緊接着是一個對象,表示向該socket發送的內容;后者接收一個事件(事件名稱用字符串表示),緊接着是收到事件調用的回調函數,其中data是收到的數據。
3.在上面的例子中,我們發送了news事件和收到了other
event事件,那么客戶端應該會有對應的接收和發送事件。沒錯,客戶端代碼和服務器正好相反,而且非常相似。
<script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost'); socket.on('news', function (data) { console.log(data); socket.emit('other event', { my: 'data' }); }); </script>
4.有兩點要注意的:socket.io.js路徑要寫對,這個js文件實際放在了服務器端的node_modules文件夾中,在請求這個文件時會重定向,因此不要詫異服務器端不存在這個文件但為什么還能正常工作。當然,你可以把服務器端的socket.io.js這個文件拷貝到本地,使它成為客戶端的js文件,這樣就不用每次都向Node服務器請求這個js文件,增強穩定性。第二點是要用var socket = io.connect('網站地址或ip');來獲取socket對象,接着就可以使用socket來收發事件。關於事件處理,上面的代碼表示收到“news”事件后,打印收到的數據,並向服務器發送“other
event”事件。
注:內置默認的事件名例如“disconnect”表示客戶端連接斷開,“message”表示收到消息等等。自定義的事件名稱,盡量不要跟Socket.IO中內置的默認事件名重名,以免造成不必要的麻煩。
5.其他常用API
1).向所有客戶端廣播:socket.broadcast.emit('broadcast message');
2).進入一個房間(非常好用!相當於一個命名空間,可以對一個特定的房間廣播而不影響在其他房間或不在房間的客戶端):socket.join('your
room name');
3).向一個房間廣播消息(發送者收不到消息):socket.broadcast.to('your room name').emit('broadcast
room message');
4).向一個房間廣播消息(包括發送者都能收到消息)(這個API屬於io.sockets):io.sockets.in('another room
name').emit('broadcast room message');
5).強制使用WebSocket通信:(客戶端)socket.send('hi'),(服務器)用socket.on('message',
function(data){})來接收。