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.iovar 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_servervar 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.ionpm 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.iovar 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 servervar 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 servervar https_server = https.createServer(options, app);//bind socket.io with https_servervar io = socketIo.listen(https_server);var sockio = socketIo.listen(http_server);//connectionio.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);//除自己,全部站点});});//connectionsockio.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 = ()=>{//connectsocket = io.connect();//recieve messagesocket.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 messageroom = 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();//阻止默认行为}}
