需要信令通道

最后更新于:2022-04-02 03:29:49

[TOC] > [参考](https://a-wing.github.io/webrtc-book-cn/04_the-need-for-a-signaling-channel.html#%E5%BB%BA%E7%AB%8B%E7%AE%80%E5%8D%95%E7%9A%84%E5%91%BC%E5%8F%AB%E6%B5%81%E7%A8%8B) ## 概述 描述涉及两个客户端和一个服务器的非常简单的 JavaScript 应用程序的设计和实现 ![](https://a-wing.github.io/webrtc-book-cn/assets/img/rcwr_0401.c20e3708.png) 1. 通道发起方,例如对等方,它首先主动与远端建立专用的通信通道 2. 信令服务器,管理通道创建并充当消息中继节点 3. 频道加入者,例如,远程方加入已存在的频道 ## 实力 ``` npm install socket.io npm install node-static ```
index.html ``` WebRTC client
```

NodeSocketIoServer.js ``` const static = require('node-static'); const http = require('http'); // 创建一个文件服务 const file = new(static.Server)(); // We use the http module’s createServer function and // use our instance of node-static to serve the files const app = http.createServer(function (req, res) { file.serve(req, res); }).listen(8181); // Use socket.io JavaScript library for real-time web applications const io = require('socket.io').listen(app); // Let's start managing connections... io.sockets.on('connection', function (socket) { // Handle 'message' messages socket.on('message', function (message) { log('S --> Got message: ', message); socket.broadcast.to(message.channel).emit('message', message.message); }); /** 1.验证所提及的渠道是一个全新的通道(即其中没有客户) 2.将服务器端 room 与通道关联 3.允许发出请求的客户端加入通道 4.向客户端发送一条名为 created 的通知消息 */ socket.on('create or join', function (channel) { const numClients = io.of('/').in(channel).clients.length console.log('numclients = ' + numClients); console.log(channel); console.log(io.sockets.adapter.rooms[channel]); // First client joining... if (numClients === 0) { socket.join(channel); socket.emit('created', channel); // Second client joining... } else if (numClients === 1) { // Inform initiator... io.sockets.in(channel).emit('remotePeerJoining', channel); // Let the new peer join channel socket.join(channel); socket.broadcast.to(channel).emit('broadcast: joined', 'S --> broadcast(): client ' + socket.id + ' joined channel ' + channel); } else { // max two clients console.log("Channel full!"); socket.emit('full', channel); } }); // Handle 'response' messages socket.on('response', function (response) { log('S --> Got response: ', response); // Just forward message to the other peer socket.broadcast.to(response.channel).emit('response', response.message); }); // Handle 'Bye' messages socket.on('Bye', function(channel){ // Notify other peer socket.broadcast.to(channel).emit('Bye'); // Close socket from server's side socket.disconnect(); }); // Handle 'Ack' messages socket.on('Ack', function () { console.log('Got an Ack!'); // Close socket from server's side socket.disconnect(); }); // Utility function used for remote logging function log() { let array = [">>> "]; for (let i = 0; i < arguments.length; i++) { array.push(arguments[i]); } socket.emit('log', array); } }); ```

访问`http://127.0.0.1:8181/`
';