记录一下先前对WEBRTC的服务器搭建

来源:互联网 发布:淘宝精选是怎么回事 编辑:程序博客网 时间:2024/05/29 17:57

房间服务器:我当时放在windows上,以下操作最好都使用管理员权限运行

1、我的房间服务器用的NOSEJS,在windows上下载NOSEJS安装程序,安装完后环境变量PATH里就自动加上了相应路径,不过最好还是检查一下

2、使用CMD走一次node -v,看到版本号了说明安装正确

3、继续安装以下组件

       > npm install express       > npm install yetify       > npm install getconfig       > npm install node-uuid       > npm install socket.io       > npm install node-static
4、自己编写房间服务器代码,主要就是给浏览器端交换offer、answer和candidate用,之所以用socket.io,是因为具备比普通ajax更高的实时性。如果担心长连接对服务器负担大,完全可以在完成接通后关闭socket,提前是你不需要用socket来干别的比如实时文本消息。由于谷歌强调安全性,在Chrome中必须要用https才允许调用本麦克风和摄像头,这里我贴一个我用https做的demo/server.js
var static = require('node-static');var http = require('https');const fs = require('fs');const options = { //这里定义https证书文件key: fs.readFileSync('site.key'),cert: fs.readFileSync('site.pem')};var file = new(static.Server)();var app = http.createServer(options, (req, res) => {file.serve(req, res);}).listen(8080);var roomPerfix = 'room_';//房间名前缀var io = require('socket.io').listen(app);io.sockets.on('connection', function (socket){//io.sockets.emit('message', socket.id + ' joind!');//某人加入在线列表socket.room_id = 0;//初始房间号为0socket.on('message', function (message) {socket.broadcast.to(roomPerfix + this.room_id).emit('message', socket.nick_name + ':' + message);});socket.on('data', function (data) {socket.broadcast.to(roomPerfix + this.room_id).emit('data', data);});socket.on('offer', function (offer) {socket.broadcast.to(roomPerfix + this.room_id).emit('offer', offer);});socket.on('answer', function (answer) {socket.broadcast.to(roomPerfix + this.room_id).emit('answer', answer);});socket.on('candidate', function (candidate) {socket.broadcast.to(roomPerfix + this.room_id).emit('candidate', candidate);});socket.on('nick_name', function (nick_name) {socket.nick_name = nick_name;});//以上事件的作用分别是:实时文本聊天、自定义类型数据传送、发起RTC呼叫、RTC回应、交换ICE、设置昵称socket.on('join_hall', function (info_type) {//进入大厅,自己的代码请自己写});//接受端上线创建房间,判断是否已经存在房间socket.on('create_room', function (room) {//自己的代码请自己写});//发起端加入房间,判断是否已经存在房间socket.on('join_room', function (room) {//同上});//遍历房间在线状态socket.on('get_room_status', function (rooms) { //rooms传过来的是一维数组,json形式var room_list = JSON.parse(rooms);var i,numClients,result=[];for(i=0;i<room_list.length;i++){numClients = io.sockets.clients(roomPerfix + room_list[i]).length;result.push({room_id:room_list[i],room_status:numClients});}socket.emit('room_status_list',JSON.stringify(result));});//拒接:结束会话,接受端将发起端移出房间socket.on('refuse_session', function (room) {socket.broadcast.to(roomPerfix + room).emit('refuse_session',room);//拒接//将发起端移出房间io.sockets.clients(roomPerfix + room).forEach(function (room_socket) {if(room_socket.id != socket.id){room_socket.room_id = 0;room_socket.leave(roomPerfix + room);}});socket.broadcast.to('hall').emit('hall_show', room);//通知大厅,我可以接受连接});socket.on('disconnect', function(data){//掉线处理});});


TURN/STUN服务器:目前没有windows版,我在centos7.2下装的turnserver-4.4.5.2

当时是照着http://www.centoscn.com/image-text/install/2015/0923/6216.html操作的,端口默认3478,自己可以根据需要配置端口和其他信息

它有个好处是同时提供stun和turn服务,这样在简单UDP穿透NAT成功的情况下,客户端之间直接建立点对点通信,不会持续占用服务器带宽,而穿透不成功时,则使用中继服务,这会占用服务器带宽,但可以保证在复杂网络环境中的连接成功率。

WEBRTC客户端加入:

var iceServer = {"iceServers": [{"url": "stun:你的IP:3478"}, {"url": "turn:你的IP:3478","username": "你的帐号","credential": "你的密码"}]};
创建RTCPeerConnection时将iceServer作为参数带上,像这样:var pc = new RTCPeerConnection(iceServer);


部署完成,便可以摆脱局域网,让自己的程序基于以上服务,飞奔在internet上了。

原创粉丝点击