socket.io提供了基於事件的實時雙向通信express
socket.io同時提供了服務端和客戶端的API服務器
服務端socket.io必須綁定一個http.Server實例app
隱式綁定框架
經過實例化時傳入端口或實例化後調用listen
或attach
函數進行隱式綁定。socket.io內部實例化並監聽http.Serverdom
實例化時傳入端口koa
let io = require('socket.io')(3000)
直接經過listen
或attach
函數綁定。listen
與attach
同義socket
let io = require('socket.io') io.listen(3000) // io.attach(3000)
顯示綁定函數
能夠手動指定http.Serverui
實例化時綁定socket.io
let server = require('http').Server(); let io = require('socket.io')(server) server.listen(3000)
經過listen
或attach
綁定
let server = require('http').Server(); let io = require('socket.io')() io.listen(server) // io.attach(server) server.listen(3000)
能夠綁定express或koa等http框架
express
let app = require('express') let server = require('http').Server(app) let io = require('socket.io')(server) app.listen(3000)
koa
let app = require('koa')() let server = require('http').Server(app.callback()) let io = require('socket.io')(server) app.listen(3000)
當服務器端與客戶端鏈接成功時,服務端會監聽到connection
和connect
事件(connection與connect同義), 客戶端會監聽到connect
事件, 斷開鏈接時服務端的對應到客戶端的socket與客戶端均會均會監聽到disconnect
事件
服務端代碼
let server = require('http').Server() let io = require('socket.io')(server) server.listen(3000); io.on('connection', socket => { console.log('connect') socket.on('disconnect', () => { console.log('disconnect') }) socket.disconnect() })
運行後打印
connect disconnect
客戶端代碼
let socket = io('http://localhost:3000') socket.on('connect', () => { console.log('connect') }) socket.on('disconnect', () => { console.log('disconnect') })
運行後打印
connect disconnect
服務器與客戶端的socket是一個關聯的EventEmitter對象,客戶端socket派發的事件能夠通以被服務端的socket接收,服務器端socket派發的事件也能夠被客戶端接受。基於這種機制,能夠實現雙向交流。
如今模擬這樣一種狀況:客戶端不停發送隨機數,當隨機數大於0.95時,服務端延時1s後向客戶端發送警告以及警告次數
服務端代碼
let server = require('http').Server() let io = require('socket.io')(server) server.listen(3000); io.on('connection', socket => { socket.on('random', value => { console.log(value) if (value > 0.95) { if (typeof socket.warning === 'undefined') socket.warning = 0 setTimeout(() => { socket.emit('warn', ++socket.warning) }, 1000) } }) })
socket對象能夠用來存儲狀態信息和自定義數據,如socket.warning
客戶端代碼
let socket = io('http://localhost:3000') let interval = setInterval(() => { socket.emit('random', Math.random()) }, 500) socket.on('warn', count => { console.log('warning count: ' + count) }) socket.on('disconnect', () => { clearInterval(interval) })
socket.io能夠處理流
服務端代碼
io.on('connection', function (socket) { let stream = ss.createStream() ss(socket).emit('script', stream) fs.createReadStream(__filename).pipe(stream) })
客戶端代碼
let socket = io('http://localhost:3000') ss(socket).on('script', stream => { let buffer = '' stream.on('data', data => { buffer += data.toString() }) stream.on('end', () => { console.log(buffer) }) })
更多文章的目錄在這裏