socket.io 是一款優(yōu)秀的WebSocket框架,簡(jiǎn)單好用。只是文檔很少,有很多技巧性用法需要自己摸索,這里我會(huì)陸續(xù)分享一些自己發(fā)現(xiàn)的使用技巧,歡迎大家討論。
官方給的client端示例
let socket = io('http://localhost');
socket.on('news', data => {
console.log(data);
socket.emit('my other event', {my: 'data'});
});
server端示例
io.on('connection', socket => { // 每次斷線重連都是新的對(duì)象
socket.emit('news', {hello: 'world'});
});
socket.io可以自己處理斷線重新連接,但是每次斷線重連之后socket都是新的對(duì)象。
假設(shè)有這樣的場(chǎng)景:每次斷線重連client都要發(fā)送一些基礎(chǔ)數(shù)據(jù)給server,可行的做法是監(jiān)控client端的connect或者reconnect事件,然后發(fā)送數(shù)據(jù)給server。但是這樣做有個(gè)兩個(gè)弊端:第一,代碼形式上不是“同步”的;第二,代碼結(jié)構(gòu)比較復(fù)雜,要寫至少兩個(gè)事件監(jiān)聽。
可以有個(gè)更簡(jiǎn)單的做法,這里拿token做個(gè)舉例:
client端
let socket = io('http://localhost/?token=900150983cd24fb0d6963f7d28e17f72');
server端
io.on('connection', socket => {
let {token} = socket.handshake.query; // 從這里可以取到client連接url的query
console.log('token');
});
如此做法,即可在建立連接同時(shí)拿到token,不需要另行發(fā)送數(shù)據(jù)進(jìn)行溝通。