socket.io之二: 基本應用

socket.io提供了基於事件的實時雙向通信express

服務端與客戶端鏈接

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

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

綁定http.Server

  1. 隱式綁定框架

經過實例化時傳入端口或實例化後調用listenattach函數進行隱式綁定。socket.io內部實例化並監聽http.Serverdom

  • 實例化時傳入端口koa

let io = require('socket.io')(3000)
  • 直接經過listenattach函數綁定。listenattach同義socket

let io = require('socket.io')
io.listen(3000) // io.attach(3000)
  1. 顯示綁定函數

能夠手動指定http.Serverui

  • 實例化時綁定socket.io

let server = require('http').Server();
let io = require('socket.io')(server)

server.listen(3000)
  • 經過listenattach綁定

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)

監聽鏈接狀態

當服務器端與客戶端鏈接成功時,服務端會監聽到connectionconnect事件(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)
  })
})

更多文章的目錄在這裏

相關文章
相關標籤/搜索