Day22 [实作] 一对一视讯通话(2): Signaling server

今天我们要实作 Signaling server 的部分:

https://ithelp.ithome.com.tw/upload/images/20211006/20130062BpShvgyeri.png

建立文件

# 进入要放专案的路径
❯ cd ~/Desktop/WebRTC/sample

# 建立名为 1-on-1-webrtc 的资料夹
❯ mkdir 1-on-1-webrtc

# 进入 1-on-1-webrtc 资料夹内部
❯ cd 1-on-1-webrtc

# 建立 server.js 文件
❯ touch server.js

# 建立静态文件资料夹
❯ mkdir pubilc

# 建立 node.js 专案
❯ npm init --yes

# 安装必要的套件
❯ npm install express socket.io

# 在静态文件资料夹内建立 index.html 并写入 hello 用於测试
❯ echo "hello" > pubilc/index.html

使用 express 读取静态文件

在 server.js 中输入以下程序码

const express = require('express')
const app = express()
const http = require('http').createServer(app)

// 静态资源
app.use('/', express.static(__dirname + '/public/'))

// TODO: Signaling

// 启动 server 监听 8080 port
http.listen(8080, () => {
  console.log(`Server running in 8080`)
})

启动 server 测试静态文件

开启终端机

❯ cd ~/Desktop/WebRTC/sample/1-on-1-webrtc
❯ node server

https://ithelp.ithome.com.tw/upload/images/20211006/20130062E23MVjcw5O.png

加入信令(Signaling)

打开 server.js 在 TODO 的地方加入以下程序码:

const io = require('socket.io')(http, {
  cors: true,
})

// 有人连线就会触发
io.on('connection', (socket) => {

  // 加入房间
  socket.on('join', (room) => {
    socket.join(room)
    socket.to(room).emit('ready', '准备通话')
  })

  // 转传 Offer
  socket.on('offer', (room, desc) => {
    socket.to(room).emit('offer', desc)
  })

	// 转传 Answer
  socket.on('answer', (room, desc) => {
    socket.to(room).emit('answer', desc)
  })

  // 交换 ice candidate
  socket.on('ice_candidate', (room, data) => {
    socket.to(room).emit('ice_candidate', data)
  })

})

server.js 完整程序码如下

const express = require('express')
const app = express()
const http = require('http').createServer(app)

// 静态资源
app.use('/', express.static(__dirname + '/public/'))

const io = require('socket.io')(http, {
  cors: true,
})

// 有人连线就会触发
io.on('connection', (socket) => {

  // 加入房间
  socket.on('join', (room) => {
    socket.join(room)
    socket.to(room).emit('ready', '准备通话')
  })

  // 转传 Offer
  socket.on('offer', (room, desc) => {
    socket.to(room).emit('offer', desc)
  })

	// 转传 Answer
  socket.on('answer', (room, desc) => {
    socket.to(room).emit('answer', desc)
  })

  // 交换 ice candidate
  socket.on('ice_candidate', (room, data) => {
    socket.to(room).emit('ice_candidate', data)
  })

})

http.listen(8080, () => {
  console.log(`Server running in 8080`)
})

启动 server

node server.js

<<:  Prototype 原型模式

>>:  Day24 vue.js测试api页面

Day 03 | 透过指令建立元件

安装并部署 Livewire 的步骤没有很多,照着做不用三分钟就能完成罗!今天一样是照着官方文件带大...

再次尝试的汇率爬虫

应该是上上篇的内容吧!关於如何取得更详细的资料,且分类清楚。之前我爬汇率时就总是爬不到东西,所以这次...

用 Python 畅玩 Line bot - 24:Flask(二)

mongoDB 除了可以让 line bot 使用之外,flask同样也可以去透过 pymongo ...

Amazon Linux 2 上解决跨来源资源共用 (CORS) 与开机自动启动 uwsgi - Day 09

Amazon Linux 2 上解决跨来源资源共用 (CORS) 与开机自动启动 uwsgi - D...

Day 19 Compose UI Animation I (Rotation)

今年的疫情蛮严重的,希望大家都过得安好,希望疫情快点过去,能回到一些线下技术聚会的时光~ 今天目标:...