首頁 > web前端 > js教程 > 主體

node.js中socket.io學習教學介紹(二)

零下一度
發布: 2017-05-03 10:02:04
原創
1338 人瀏覽過

socket.io提供了基於事件的即時雙向通訊,以下這篇文章主要給大家介紹了socket.io基本應用的相關資料,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

前言

Socket.IO支援及時、雙向與基於事件的交流。它可以在每個平台、每個瀏覽器和每個裝置上運作,可靠性和速度同樣穩定。

  • 即時分析:將資料推送到客戶端,這些客戶端會被表示為即時計數器,圖表或日誌客戶。

  • 即時通訊與聊天:只需幾行程式碼即可寫成一個Socket.IO的”Hello,World」聊天應用程式。

  • 二進位串流傳輸:從1.0版本開始,Socket.IO支援任何形式的二進位檔案傳輸,例如:圖片,視頻,音訊等。

  • 文檔合併:允許多個使用者同時編輯一個文檔,並且能夠看到每個使用者所做的修改。

服務端與客戶端連接

socket.io同時提供了服務端和客戶端的API

服務端socket.io必須綁定一個http.Server實例

#綁定http.Server

1、隱含綁定

透過實例化時傳入連接埠或實例化後呼叫listen或attach函數進行隱式綁定。 socket.io內部實例化並監聽http.Server

實例化時傳入連接埠

let io = require('socket.io')(3000)
登入後複製

直接透過listen或attach函數綁定。 listen與attach同義

let io = require('socket.io') 
io.listen(3000) // io.attach(3000)
登入後複製

2、顯示綁定

可以手動指定http.Server

實例化時綁定

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)
 })
})
登入後複製

以上是node.js中socket.io學習教學介紹(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!