8-1 【学前概念】如何使用socket.io发送消息

图片.png
图片.png
图片.png

图片.png

图片.png
图片.png
图片.png

8-2 【学前概念】WebRTC信令服务器原理

图片.png
图片.png
图片.png

图片.png

图片.png

图片.png

8-3 【实战】WebRTC信令服务器的实现

图片.png5

  1. 'use strict'
  2. var http = require('http');
  3. var https = require('https');
  4. var fs = require('fs');
  5. var serveIndex = require('serve-index');
  6. var express = require('express');
  7. var app = express();
  8. //socket.io
  9. var socketIO = require('socket.io');
  10. var log4js = require('log4js');
  11. log4js.configure({
  12. appenders: {
  13. file: {
  14. type: 'file',
  15. filename: 'app.log',
  16. layout: {
  17. type: 'pattern',
  18. pattern: '%r %p - %m',
  19. }
  20. }
  21. },
  22. categories: {
  23. default: {
  24. appenders: ['file'],
  25. level: 'debug'
  26. }
  27. }
  28. });
  29. //日志
  30. var logger = log4js.getLogger();
  31. //顺序不能换
  32. app.use(serveIndex('./public'));
  33. app.use(express.static('./public'));
  34. var options = {
  35. key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'),
  36. cert : fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem')
  37. }
  38. //bind socket.io with https_server
  39. var https_server = https.createServer(options, app);
  40. var io = socketIO.listen(https_server);
  41. io.sockets.on('connection',(socket)=>{
  42. socket.on('join', (room)=> {
  43. socket.join(room);
  44. //房间号
  45. var myRoom = io.sockets.adapter.rooms[room];
  46. //房间的人数
  47. var users = Object.keys(myRoom.sockets).length;
  48. logger.log('the number of user in room is: ' + users);
  49. //只给自己回复消息
  50. socket.emit('joined', room, socket.id);
  51. //除自己以外的房间里面其他人
  52. //socket.to(room).emit('joined', room, socket.id);
  53. //房间里面所有人
  54. //io.in(room).emit('joined',room, socket.id);
  55. //除自己以外的全部站点
  56. //socket.broadcast.emit('joined',room, socket.id);
  57. });
  58. socket.on('leave', (room)=> {
  59. var myRoom = io.sockets.adapter.rooms[room];
  60. var users = Object.keys(myRoom.sockets).length;
  61. //users - 1;
  62. logger.log('the number of user in room is: ' + (users-1));
  63. socket.leave(room);
  64. socket.to(room).emit('bye', room, socket.id)//房间内所有人,除自己外
  65. socket.emit('leaved', room, socket.id);
  66. //只给自己回复消息
  67. socket.emit('leaved', room, socket.id);
  68. //除自己以外的房间里面其他人
  69. //socket.to(room).emit('leaved', room, socket.id);
  70. //房间里面所有人
  71. //io.in(room).emit('leaved',room, socket.id);
  72. //除自己以外的全部站点
  73. //socket.broadcast.emit('leaved',room, socket.id);
  74. });
  75. });
  76. https_server.listen(443, '0.0.0.0');

需要安装

  1. npm install socket.io log4js

运行报错
socketIo.listen is not a function
https://blog.csdn.net/Crisf/article/details/113976041

  1. 方法1-修改代码:
  2. 修改
  3. var io = socketIO.listen(https_server);
  4. 改为
  5. var io = socketIO(https_server);
  6. 方法2-socket.io降低版本
  7. npm uninstall socket.io
  8. npm install socket.io@2.0.4

8-4 【实战】利用socket.io实现简单聊天室

该代码在新版本socket.io会有问题,所以需要降级。
npm install socket.io@2.0.3
图片.png
图片.png
8-4 利用socket.io实现简单聊天室.zip

1)服务器代码

  1. 'use strict'
  2. var http = require('http');
  3. var https = require('https');
  4. var fs = require('fs');
  5. var express = require('express');
  6. var serveIndex = require('serve-index');
  7. //socket.io
  8. var socketIo = require('socket.io');
  9. //
  10. var log4js = require('log4js');
  11. log4js.configure({
  12. appenders: {
  13. file: {
  14. type: 'file',
  15. filename: 'app.log',
  16. layout: {
  17. type: 'pattern',
  18. pattern: '%r %p - %m',
  19. }
  20. }
  21. },
  22. categories: {
  23. default: {
  24. appenders: ['file'],
  25. level: 'debug'
  26. }
  27. }
  28. });
  29. var logger = log4js.getLogger();
  30. var app = express();
  31. app.use(serveIndex('./public'));
  32. app.use(express.static('./public'));
  33. //http server
  34. var http_server = http.createServer(app);
  35. http_server.listen(80, '0.0.0.0');
  36. var options = {
  37. key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'),
  38. cert: fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem')
  39. }
  40. //https server
  41. var https_server = https.createServer(options, app);
  42. //bind socket.io with https_server
  43. var io = socketIo.listen(https_server);
  44. var sockio = socketIo.listen(http_server);
  45. //connection
  46. io.sockets.on('connection', (socket)=>{
  47. socket.on('message', (room, data)=>{
  48. socket.to(room).emit('message', room, socket.id, data)//房间内所有人,除自己外
  49. });
  50. //该函数应该加锁
  51. socket.on('join', (room)=> {
  52. socket.join(room);
  53. var myRoom = io.sockets.adapter.rooms[room];
  54. var users = Object.keys(myRoom.sockets).length;
  55. logger.log('the number of user in room is: ' + users);
  56. //在这里可以控制进入房间的人数,现在一个房间最多 2个人
  57. //为了便于客户端控制,如果是多人的话,应该将目前房间里
  58. //人的个数当做数据下发下去。
  59. if(users < 3) {
  60. socket.emit('joined', room, socket.id);
  61. if (users > 1) {
  62. socket.to(room).emit('otherjoin', room);//除自己之外
  63. }
  64. }else {
  65. socket.leave(room);
  66. socket.emit('full', room, socket.id);
  67. }
  68. //socket.to(room).emit('joined', room, socket.id);//除自己之外
  69. //io.in(room).emit('joined', room, socket.id)//房间内所有人
  70. //socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
  71. });
  72. socket.on('leave', (room)=> {
  73. var myRoom = io.sockets.adapter.rooms[room];
  74. var users = Object.keys(myRoom.sockets).length;
  75. //users - 1;
  76. logger.log('the number of user in room is: ' + (users-1));
  77. socket.leave(room);
  78. socket.to(room).emit('bye', room, socket.id)//房间内所有人,除自己外
  79. socket.emit('leaved', room, socket.id);
  80. //socket.to(room).emit('joined', room, socket.id);//除自己之外
  81. //io.in(room).emit('joined', room, socket.id)//房间内所有人
  82. //socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
  83. });
  84. });
  85. //connection
  86. sockio.sockets.on('connection', (socket)=>{
  87. socket.on('message', (room, data)=>{
  88. socket.to(room).emit('message', room, socket.id, data)//房间内所有人
  89. });
  90. socket.on('join', (room)=> {
  91. socket.join(room);
  92. var myRoom = sockio.sockets.adapter.rooms[room];
  93. var users = Object.keys(myRoom.sockets).length;
  94. logger.log('the number of user in room is: ' + users);
  95. socket.emit('joined', room, socket.id);
  96. //socket.to(room).emit('joined', room, socket.id);//除自己之外
  97. //io.in(room).emit('joined', room, socket.id)//房间内所有人
  98. //socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
  99. });
  100. socket.on('leave', (room)=> {
  101. var myRoom = sockio.sockets.adapter.rooms[room];
  102. var users = Object.keys(myRoom.sockets).length;
  103. //users - 1;
  104. logger.log('the number of user in room is: ' + (users-1));
  105. socket.leave(room);
  106. socket.emit('leaved', room, socket.id);
  107. //socket.to(room).emit('joined', room, socket.id);//除自己之外
  108. //io.in(room).emit('joined', room, socket.id)//房间内所有人
  109. //socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点
  110. });
  111. });
  112. https_server.listen(443, '0.0.0.0');

2)客户端代码

  1. <html>
  2. <head>
  3. <title>Chat Room</title>
  4. <link rel="stylesheet" href="./css/main.css"></link>
  5. </head>
  6. <body>
  7. <table align="center">
  8. <tr>
  9. <td>
  10. <label>UserName: </label>
  11. <input type=text id="username"></input>
  12. </td>
  13. </tr>
  14. <tr>
  15. <td>
  16. <label>room: </label>
  17. <input type=text id="room"></input>
  18. <button id="connect">Conect</button>
  19. <button id="leave" disabled>Leave</button>
  20. </td>
  21. </tr>
  22. <tr>
  23. <td>
  24. <label>Content: </label><br>
  25. <textarea disabled style="line-height: 1.5;" id="output" rows="10" cols="100"></textarea>
  26. </td>
  27. </tr>
  28. <tr>
  29. <td>
  30. <label>Input: </label><br>
  31. <textarea disabled id="input" rows="3" cols="100"></textarea>
  32. </td>
  33. </tr>
  34. <tr>
  35. <td>
  36. <button id="send">Send</button>
  37. </td>
  38. </tr>
  39. </table>
  40. <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
  41. <script src="./js/client.js"></script>
  42. </body>
  43. </html>
  1. 'use strict'
  2. //
  3. var userName = document.querySelector('input#username');
  4. var inputRoom = document.querySelector('input#room');
  5. var btnConnect = document.querySelector('button#connect');
  6. var btnLeave = document.querySelector('button#leave');
  7. var outputArea = document.querySelector('textarea#output');
  8. var inputArea = document.querySelector('textarea#input');
  9. var btnSend = document.querySelector('button#send');
  10. var socket;
  11. var room;
  12. btnConnect.onclick = ()=>{
  13. //connect
  14. socket = io.connect();
  15. //recieve message
  16. socket.on('joined', (room, id) => {
  17. btnConnect.disabled = true;
  18. btnLeave.disabled = false;
  19. inputArea.disabled = false;
  20. btnSend.disabled = false;
  21. });
  22. socket.on('leaved', (room, id) => {
  23. btnConnect.disabled = false;
  24. btnLeave.disabled = true;
  25. inputArea.disabled = true;
  26. btnSend.disabled = true;
  27. socket.disconnect();
  28. });
  29. //显示接收到的消息
  30. socket.on('message', (room, id, data) => {
  31. outputArea.scrollTop = outputArea.scrollHeight;//窗口总是显示最后的内容
  32. outputArea.value = outputArea.value + data + '\r';
  33. });
  34. socket.on('disconnect', (socket)=>{
  35. btnConnect.disabled = false;
  36. btnLeave.disabled = true;
  37. inputArea.disabled = true;
  38. btnSend.disabled = true;
  39. });
  40. //send message
  41. room = inputRoom.value;
  42. socket.emit('join', room);
  43. }
  44. btnSend.onclick = ()=>{
  45. var data = inputArea.value;
  46. data = userName.value + ':' + data;
  47. socket.emit('message', room, data);
  48. inputArea.value = '';
  49. }
  50. btnLeave.onclick = ()=>{
  51. room = inputRoom.value;
  52. socket.emit('leave', room);
  53. }
  54. inputArea.onkeypress = (event)=> {
  55. //event = event || window.event;
  56. if (event.keyCode == 13) { //回车发送消息
  57. var data = inputArea.value;
  58. data = userName.value + ':' + data;
  59. socket.emit('message', room, data);
  60. inputArea.value = '';
  61. event.preventDefault();//阻止默认行为
  62. }
  63. }