socket.io學(xué)習(xí)教程之基本應(yīng)用(二)
前言
Socket.IO支持及時(shí)、雙向與基于事件的交流。它可以在每個(gè)平臺(tái)、每個(gè)瀏覽器和每個(gè)設(shè)備上工作,可靠性和速度同樣穩(wěn)定。
- 實(shí)時(shí)分析:將數(shù)據(jù)推送到客戶端,這些客戶端會(huì)被表示為實(shí)時(shí)計(jì)數(shù)器,圖表或日志客戶。
- 實(shí)時(shí)通信和聊天:只需幾行代碼便可寫成一個(gè)Socket.IO的”Hello,World”聊天應(yīng)用。
- 二進(jìn)制流傳輸:從1.0版本開始,Socket.IO支持任何形式的二進(jìn)制文件傳輸,例如:圖片,視頻,音頻等。
- 文檔合并:允許多個(gè)用戶同時(shí)編輯一個(gè)文檔,并且能夠看到每個(gè)用戶做出的修改。
服務(wù)端與客戶端連接
socket.io同時(shí)提供了服務(wù)端和客戶端的API
服務(wù)端socket.io必須綁定一個(gè)http.Server實(shí)例
綁定http.Server
1、隱式綁定
通過實(shí)例化時(shí)傳入端口或?qū)嵗笳{(diào)用listen或attach函數(shù)進(jìn)行隱式綁定。socket.io內(nèi)部實(shí)例化并監(jiān)聽http.Server
實(shí)例化時(shí)傳入端口
let io = require('socket.io')(3000)
直接通過listen或attach函數(shù)綁定。listen與attach同義
let io = require('socket.io') io.listen(3000) // io.attach(3000)
2、顯示綁定
可以手動(dòng)指定http.Server
實(shí)例化時(shí)綁定
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)
監(jiān)聽連接狀態(tài)
當(dāng)服務(wù)器端與客戶端連接成功時(shí),服務(wù)端會(huì)監(jiān)聽到connection和connect事件(connection與connect同義), 客戶端會(huì)監(jiān)聽到connect事件, 斷開連接時(shí)服務(wù)端的對(duì)應(yīng)到客戶端的socket與客戶端均會(huì)均會(huì)監(jiān)聽到disconnect事件
服務(wù)端代碼
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() })
運(yùn)行后打印
connect disconnect
客戶端代碼
let socket = io('http://localhost:3000') socket.on('connect', () => { console.log('connect') }) socket.on('disconnect', () => { console.log('disconnect') })
運(yùn)行后打印
connect disconnect
傳輸數(shù)據(jù)
服務(wù)器與客戶端的socket是一個(gè)關(guān)聯(lián)的EventEmitter對(duì)象,客戶端socket派發(fā)的事件可以通以被服務(wù)端的socket接收,服務(wù)器端socket派發(fā)的事件也可以被客戶端接受?;谶@種機(jī)制,可以實(shí)現(xiàn)雙向交流。
現(xiàn)在模擬這樣一種情況:客戶端不停發(fā)送隨機(jī)數(shù),當(dāng)隨機(jī)數(shù)大于0.95時(shí),服務(wù)端延時(shí)1s后向客戶端發(fā)送警告以及警告次數(shù)
服務(wù)端代碼
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對(duì)象可以用來存儲(chǔ)狀態(tài)信息和自定義數(shù)據(jù),如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可以處理流
服務(wù)端代碼
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) }) })
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
使用node搭建自動(dòng)發(fā)圖文微博機(jī)器人的方法
這篇文章主要介紹了使用node搭建自動(dòng)發(fā)圖文微博機(jī)器人的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Windows 系統(tǒng)下設(shè)置Nodejs NPM全局路徑
這篇文章主要介紹了Windows 系統(tǒng)下設(shè)置Nodejs NPM全局路徑2016-04-04node.js使用express框架進(jìn)行文件上傳詳解
在本篇內(nèi)容里小編給大家整理了關(guān)于node.js使用express框架進(jìn)行文件上傳的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2019-03-03package-lock.json解決依賴的版本管理使用詳解
這篇文章主要為大家介紹了package-lock.json解決依賴的版本管理使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Mongoose實(shí)現(xiàn)虛擬字段查詢的方法詳解
這篇文章主要給大家介紹了關(guān)于Mongoose實(shí)現(xiàn)虛擬字段查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08