房间服务器:我当时放在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;//初始房间号为0
socket.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
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上了。