server.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. const { App, DEDICATED_COMPRESSOR_256KB } = require('uWebSockets.js')
  2. const ROOMS = {}
  3. // 日志配置
  4. const log4js = require("log4js");
  5. log4js.configure({
  6. appenders: { socket: { type: "file", filename: "./socket.log" } },
  7. categories: { default: { appenders: ["socket"], level: "debug" } }
  8. });
  9. const logger = log4js.getLogger('socket');
  10. App().ws('/*', {
  11. compression: DEDICATED_COMPRESSOR_256KB,
  12. idleTimeout: 12,
  13. sendPingsAutomatically: true,
  14. upgrade: (res, req, context) => {
  15. const url = req.getUrl()
  16. const secWebSocketKey = req.getHeader('sec-websocket-key');
  17. const secWebSocketProtocol = req.getHeader('sec-websocket-protocol');
  18. const secWebSocketExtensions = req.getHeader('sec-websocket-extensions');
  19. const prams = url.split('/')
  20. if (prams.length > 1 && prams.length <= 3) {
  21. const ID = prams[1]
  22. const Name = prams[2]
  23. const isTrue = ROOMS[ID]
  24. if (isTrue) {
  25. // 有房间
  26. if (isTrue.length >= 2) {
  27. // 房间满
  28. res.close()
  29. } else {
  30. ROOMS[ID].push(Name)
  31. // 建立连接
  32. res.upgrade({ url: url }, secWebSocketKey, secWebSocketProtocol, secWebSocketExtensions, context)
  33. }
  34. } else {
  35. // 无房间
  36. ROOMS[ID] = []
  37. ROOMS[ID].push(Name)
  38. // 建立连接
  39. res.upgrade({ url: url }, secWebSocketKey, secWebSocketProtocol, secWebSocketExtensions, context)
  40. }
  41. } else {
  42. res.close()
  43. }
  44. },
  45. /* 处理程序 */
  46. open: (socket) => {
  47. /* 订阅主题 */
  48. const { url } = socket
  49. if (!url) return
  50. const prams = url.split('/')
  51. const room = prams[1]
  52. const name = prams[2]
  53. socket.subscribe(`/${room}`)
  54. logger.debug(`${name}加入${room}号房间,人数:${ROOMS[room].length}`);
  55. },
  56. message: (socket, message,isBinary) => {
  57. // 转发消息
  58. const { url } = socket
  59. if (!url) return
  60. const room = url.split('/')[1]
  61. socket.publish(`/${room}`, message,isBinary);
  62. // buffer | string | blob
  63. // const txt = Buffer.from(message).toString()
  64. // console.log('接受消息',message,isBinary);
  65. // socket.send(message,isBinary)
  66. },
  67. close: (socket, code) => {
  68. // 连接关闭
  69. const { url } = socket
  70. if (url) {
  71. const prams = url.split('/')
  72. if (prams.length <= 1) return
  73. // 移除
  74. const ID = prams[1]
  75. const Name = prams[2]
  76. const isHave = ROOMS[ID].indexOf(Name)
  77. if (isHave != -1) {
  78. ROOMS[ID].splice(isHave, 1)
  79. if (!ROOMS[ID].length) delete ROOMS[ID]
  80. }
  81. }
  82. console.log('断开',ROOMS);
  83. logger.debug(`所有房间:${JSON.stringify(ROOMS)}`);
  84. }
  85. }).listen(49800, token => {
  86. token ? logger.debug(`socket服务启动:49800`) : logger.debug(`socket服务启动失败`);
  87. })