8-1 【学前概念】如何使用socket.io发送消息
8-2 【学前概念】WebRTC信令服务器原理
8-3 【实战】WebRTC信令服务器的实现
5
'use strict'
var http = require('http');
var https = require('https');
var fs = require('fs');
var serveIndex = require('serve-index');
var express = require('express');
var app = express();
//socket.io
var socketIO = require('socket.io');
var log4js = require('log4js');
log4js.configure({
appenders: {
file: {
type: 'file',
filename: 'app.log',
layout: {
type: 'pattern',
pattern: '%r %p - %m',
}
}
},
categories: {
default: {
appenders: ['file'],
level: 'debug'
}
}
});
//日志
var logger = log4js.getLogger();
//顺序不能换
app.use(serveIndex('./public'));
app.use(express.static('./public'));
var options = {
key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'),
cert : fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem')
}
//bind socket.io with https_server
var https_server = https.createServer(options, app);
var io = socketIO.listen(https_server);
io.sockets.on('connection',(socket)=>{
socket.on('join', (room)=> {
socket.join(room);
//房间号
var myRoom = io.sockets.adapter.rooms[room];
//房间的人数
var users = Object.keys(myRoom.sockets).length;
logger.log('the number of user in room is: ' + users);
//只给自己回复消息
socket.emit('joined', room, socket.id);
//除自己以外的房间里面其他人
//socket.to(room).emit('joined', room, socket.id);
//房间里面所有人
//io.in(room).emit('joined',room, socket.id);
//除自己以外的全部站点
//socket.broadcast.emit('joined',room, socket.id);
});
socket.on('leave', (room)=> {
var myRoom = io.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length;
//users - 1;
logger.log('the number of user in room is: ' + (users-1));
socket.leave(room);
socket.to(room).emit('bye', room, socket.id)//房间内所有人,除自己外
socket.emit('leaved', room, socket.id);
//只给自己回复消息
socket.emit('leaved', room, socket.id);
//除自己以外的房间里面其他人
//socket.to(room).emit('leaved', room, socket.id);
//房间里面所有人
//io.in(room).emit('leaved',room, socket.id);
//除自己以外的全部站点
//socket.broadcast.emit('leaved',room, socket.id);
});
});
https_server.listen(443, '0.0.0.0');
需要安装
npm install socket.io log4js
运行报错
socketIo.listen is not a function
https://blog.csdn.net/Crisf/article/details/113976041
方法1-修改代码:
修改
var io = socketIO.listen(https_server);
改为
var io = socketIO(https_server);
方法2-socket.io降低版本
npm uninstall socket.io
npm install socket.io@2.0.4
8-4 【实战】利用socket.io实现简单聊天室
该代码在新版本socket.io会有问题,所以需要降级。
npm install socket.io@2.0.3
8-4 利用socket.io实现简单聊天室.zip
1)服务器代码
'use strict'
var http = require('http');
var https = require('https');
var fs = require('fs');
var express = require('express');
var serveIndex = require('serve-index');
//socket.io
var socketIo = require('socket.io');
//
var log4js = require('log4js');
log4js.configure({
appenders: {
file: {
type: 'file',
filename: 'app.log',
layout: {
type: 'pattern',
pattern: '%r %p - %m',
}
}
},
categories: {
default: {
appenders: ['file'],
level: 'debug'
}
}
});
var logger = log4js.getLogger();
var app = express();
app.use(serveIndex('./public'));
app.use(express.static('./public'));
//http server
var http_server = http.createServer(app);
http_server.listen(80, '0.0.0.0');
var options = {
key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'),
cert: fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem')
}
//https server
var https_server = https.createServer(options, app);
//bind socket.io with https_server
var io = socketIo.listen(https_server);
var sockio = socketIo.listen(http_server);
//connection
io.sockets.on('connection', (socket)=>{
socket.on('message', (room, data)=>{
socket.to(room).emit('message', room, socket.id, data)//房间内所有人,除自己外
});
//该函数应该加锁
socket.on('join', (room)=> {
socket.join(room);
var myRoom = io.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length;
logger.log('the number of user in room is: ' + users);
//在这里可以控制进入房间的人数,现在一个房间最多 2个人
//为了便于客户端控制,如果是多人的话,应该将目前房间里
//人的个数当做数据下发下去。
if(users < 3) {
socket.emit('joined', room, socket.id);
if (users > 1) {
socket.to(room).emit('otherjoin', room);//除自己之外
}
}else {
socket.leave(room);
socket.emit('full', room, socket.id);
}
//socket.to(room).emit('joined', room, socket.id);//除自己之外
//io.in(room).emit('joined', room, socket.id)//房间内所有人
//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
});
socket.on('leave', (room)=> {
var myRoom = io.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length;
//users - 1;
logger.log('the number of user in room is: ' + (users-1));
socket.leave(room);
socket.to(room).emit('bye', room, socket.id)//房间内所有人,除自己外
socket.emit('leaved', room, socket.id);
//socket.to(room).emit('joined', room, socket.id);//除自己之外
//io.in(room).emit('joined', room, socket.id)//房间内所有人
//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
});
});
//connection
sockio.sockets.on('connection', (socket)=>{
socket.on('message', (room, data)=>{
socket.to(room).emit('message', room, socket.id, data)//房间内所有人
});
socket.on('join', (room)=> {
socket.join(room);
var myRoom = sockio.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length;
logger.log('the number of user in room is: ' + users);
socket.emit('joined', room, socket.id);
//socket.to(room).emit('joined', room, socket.id);//除自己之外
//io.in(room).emit('joined', room, socket.id)//房间内所有人
//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
});
socket.on('leave', (room)=> {
var myRoom = sockio.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length;
//users - 1;
logger.log('the number of user in room is: ' + (users-1));
socket.leave(room);
socket.emit('leaved', room, socket.id);
//socket.to(room).emit('joined', room, socket.id);//除自己之外
//io.in(room).emit('joined', room, socket.id)//房间内所有人
//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
});
});
https_server.listen(443, '0.0.0.0');
2)客户端代码
<html>
<head>
<title>Chat Room</title>
<link rel="stylesheet" href="./css/main.css"></link>
</head>
<body>
<table align="center">
<tr>
<td>
<label>UserName: </label>
<input type=text id="username"></input>
</td>
</tr>
<tr>
<td>
<label>room: </label>
<input type=text id="room"></input>
<button id="connect">Conect</button>
<button id="leave" disabled>Leave</button>
</td>
</tr>
<tr>
<td>
<label>Content: </label><br>
<textarea disabled style="line-height: 1.5;" id="output" rows="10" cols="100"></textarea>
</td>
</tr>
<tr>
<td>
<label>Input: </label><br>
<textarea disabled id="input" rows="3" cols="100"></textarea>
</td>
</tr>
<tr>
<td>
<button id="send">Send</button>
</td>
</tr>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script src="./js/client.js"></script>
</body>
</html>
'use strict'
//
var userName = document.querySelector('input#username');
var inputRoom = document.querySelector('input#room');
var btnConnect = document.querySelector('button#connect');
var btnLeave = document.querySelector('button#leave');
var outputArea = document.querySelector('textarea#output');
var inputArea = document.querySelector('textarea#input');
var btnSend = document.querySelector('button#send');
var socket;
var room;
btnConnect.onclick = ()=>{
//connect
socket = io.connect();
//recieve message
socket.on('joined', (room, id) => {
btnConnect.disabled = true;
btnLeave.disabled = false;
inputArea.disabled = false;
btnSend.disabled = false;
});
socket.on('leaved', (room, id) => {
btnConnect.disabled = false;
btnLeave.disabled = true;
inputArea.disabled = true;
btnSend.disabled = true;
socket.disconnect();
});
//显示接收到的消息
socket.on('message', (room, id, data) => {
outputArea.scrollTop = outputArea.scrollHeight;//窗口总是显示最后的内容
outputArea.value = outputArea.value + data + '\r';
});
socket.on('disconnect', (socket)=>{
btnConnect.disabled = false;
btnLeave.disabled = true;
inputArea.disabled = true;
btnSend.disabled = true;
});
//send message
room = inputRoom.value;
socket.emit('join', room);
}
btnSend.onclick = ()=>{
var data = inputArea.value;
data = userName.value + ':' + data;
socket.emit('message', room, data);
inputArea.value = '';
}
btnLeave.onclick = ()=>{
room = inputRoom.value;
socket.emit('leave', room);
}
inputArea.onkeypress = (event)=> {
//event = event || window.event;
if (event.keyCode == 13) { //回车发送消息
var data = inputArea.value;
data = userName.value + ':' + data;
socket.emit('message', room, data);
inputArea.value = '';
event.preventDefault();//阻止默认行为
}
}