这是对"李超"老师线上课程"如何通过Node.js实现一套简单的信令系统"的总结。并在Window平台下实现一遍,对Node.js入门或想用window平台学习的,或许有一定的帮助。
开发环境的搭建
1、 NodeJS的下载
访问地址:https://nodejs.org/en/download/
2、NodeJS的安装
根据提示直接进行傻瓜式安装即可。
4、NPM的安装
正常情况下,NodeJS安装完成后,随带把NPM安装好了。
5、验证NodeJS是否安装成功
Win + R , 输入cmd ,打开dos命令行,输入 node -v
查看NodeJS版本号。
6、验证NPM是否安装成功
Win + R , 输入cmd ,打开dos命令行,输入 npm -v
查看NPM版本号。
7、在即将演示的例子需要使用NPM安装socket.io和node-static,安装方法如下:
npm install socket.io
npm install node-static
示例的目录结构
演示功能
-
客户端发送消息给服务端
-
后端触发事件告知客户端
-
客户端离开触发服务端事件
服务端
server.js
const static = require('node-static');
const http = require('http');
const file = new(static.Server)();
const app = http.createServer(function (req, res) {
file.serve(req, res);
}).listen(2013, ()=>{
console.log('listening 2013');
})
console.log('start create listen!');
const io = require('socket.io').listen(app); // 侦听 2013
io.sockets.on('connection', (socket) => {
// convenience function to log server messages to the client
function log(){
const array = ['>>> Message from server: '];
for (var i = 0; i < arguments.length; i++) {
array.push(arguments[i]);
}
socket.emit('log', array);
}
socket.on('message', (message) => { // 收到 message 时,进行广播
console.log(message);
log('Got message:', message);
// for a real app, would be room only (not broadcast)
socket.broadcast.emit('message', message); // 在真实的应用中,应该只在房间内广播
});
socket.on('create or join', (room) => { // 收到 “create or join” 消息
console.log(room);
var clientsInRoom = io.sockets.adapter.rooms[room];
var numClients = clientsInRoom ? Object.keys(clientsInRoom.sockets).length : 0; // 房间里的人数
log('Room ' + room + ' has ' + numClients + ' client(s)');
log('Request to create or join room ' + room);
if (numClients === 0){ // 如果房间里没人
socket.join(room);
socket.emit('created', room); // 发送 "created" 消息
} else if (numClients === 1) { // 如果房间里有一个人
io.sockets.in(room).emit('join', room);
socket.join(room);
socket.emit('joined', room); // 发送 “joined”消息
} else { // max two clients
socket.emit('full', room); // 发送 "full" 消息
}
socket.emit('emit(): client ' + socket.id +
' joined room ' + room);
socket.broadcast.emit('broadcast(): client ' + socket.id +
' joined room ' + room);
});
socket.on('disconnect', function(data) {
console.log('ssuqin断开',data);
})
});
客户端
client.html
<!DOCTYPE html>
<html>
<head>
<title>WebRTC client</title>
</head>
<body>
<script src='C:/Program Files/nodejs/node_modules/socket.io-client/dist/socket.io.js'></script>
<script src='js/client.js'></script>
</body>
</html>
client.js
var isInitiator;
room = prompt('Enter room name:');
const socket = io.connect("http://192.168.1.7:2013");
/**
socket.on('connect', function() {
socket.emit('pong',{message:"ciaooo"});
socket.on('ping', function (data) {
alert(data);
});
*/
if (room !== '') {
console.log('Joining room ' + room);
socket.emit('create or join', room);
}
socket.on('full', (room) => {
console.log('Room ' + room + ' is full');
});
socket.on('empty', (room) => {
isInitiator = true;
console.log('Room ' + room + ' is empty');
});
socket.on('join', (room) => {
console.log('Making request to join room ' + room);
console.log('You are the initiator!');
});
socket.on('joined', (room) => {
console.log('joined room[' + room +']');
});
socket.on('created', (room) => {
console.log('created room[' + room +']');
});
socket.on('log', (array) => {
console.log.apply(console, array);
});
socket.on((message) => {
console.log(message);
});
启动服务端并测试
node server.js
启动客户端
用chrome打开client.html页面,连续打开三个或三个以上。下面让我们通过浏览器的控制台去看看发生了什么吧。下面是我的输出结果:
参考链接:
https://www.e-learn.cn/content/wangluowenzhang/1060289
https://www.cnblogs.com/fengch/p/8634438.html
https://www.cnblogs.com/zqzjs/p/6370072.html