socket.io學習教程之基本應用(二),socket.io教程

來源:互聯網
上載者:User

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) })})

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.