Browse Source

test uws
Signed-off-by: caner <5658514@qq.com>

caner 3 years ago
parent
commit
fa6d329cef
3 changed files with 143 additions and 0 deletions
  1. 34 0
      client.js
  2. 18 0
      package.json
  3. 91 0
      server.js

+ 34 - 0
client.js

@@ -0,0 +1,34 @@
+const fs = require('fs')
+const W3CWebSocket = require('websocket').w3cwebsocket;
+// 房间号/用户名
+const client = new W3CWebSocket('ws://127.0.0.1:49800/123/123', 'echo-protocol');
+
+client.onerror = function () {
+    console.log('Connection Error');
+};
+
+client.onopen = function () {
+    console.log('已连接');
+
+    // function sendNumber() {
+    //     if (client.readyState === client.OPEN) {
+    //         var number = Math.round(Math.random() * 0xFFFFFF);
+    //         client.send(number.toString());
+    //         setTimeout(sendNumber, 1000);
+    //     }
+    // }
+    // sendNumber();
+};
+
+client.onclose = function () {
+    console.log('echo-protocol Client Closed');
+};
+
+client.onmessage = function (event) {
+    if (typeof event.data === 'object') {
+        console.log('文件', event)       
+    } else {
+        const obj = JSON.parse(event.data)
+        console.log('数据', obj)
+    }
+};

+ 18 - 0
package.json

@@ -0,0 +1,18 @@
+{
+  "name": "server",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "build": "pkg . -t node14-linux-x64 --out-path=dist/",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "bin": "./index.js",
+  "license": "ISC",
+  "dependencies": {
+    "log4js": "^6.4.1",
+    "uWebSockets.js": "uNetworking/uWebSockets.js#v20.12.0",
+    "websocket": "^1.0.34"
+  }
+}

+ 91 - 0
server.js

@@ -0,0 +1,91 @@
+const { App, DEDICATED_COMPRESSOR_256KB } = require('uWebSockets.js')
+const ROOMS = {}
+
+// 日志配置
+const log4js = require("log4js");
+log4js.configure({
+    appenders: { socket: { type: "file", filename: "./socket.log" } },
+    categories: { default: { appenders: ["socket"], level: "debug" } }
+});
+const logger = log4js.getLogger('socket');
+
+App().ws('/*', {
+    compression: DEDICATED_COMPRESSOR_256KB,
+    idleTimeout: 12,
+    sendPingsAutomatically: true,
+    upgrade: (res, req, context) => {
+        const url = req.getUrl()
+        const secWebSocketKey = req.getHeader('sec-websocket-key');
+        const secWebSocketProtocol = req.getHeader('sec-websocket-protocol');
+        const secWebSocketExtensions = req.getHeader('sec-websocket-extensions');
+        const prams = url.split('/')
+        if (prams.length > 1 && prams.length <= 3) {
+            const ID = prams[1]
+            const Name = prams[2]
+            const isTrue = ROOMS[ID]
+            if (isTrue) {
+                // 有房间
+                if (isTrue.length >= 2) {
+                    // 房间满
+                    res.close()
+                } else {
+                    ROOMS[ID].push(Name)
+                    // 建立连接
+                    res.upgrade({ url: url }, secWebSocketKey, secWebSocketProtocol, secWebSocketExtensions, context)
+                }
+            } else {
+                // 无房间
+                ROOMS[ID] = []
+                ROOMS[ID].push(Name)
+                // 建立连接
+                res.upgrade({ url: url }, secWebSocketKey, secWebSocketProtocol, secWebSocketExtensions, context)
+            }
+        } else {
+            res.close()
+        }
+
+    },
+    /* 处理程序 */
+    open: (socket) => {
+        /* 订阅主题 */
+        const { url } = socket
+        if (!url) return
+        const prams = url.split('/')
+        const room = prams[1]
+        const name = prams[2]
+        socket.subscribe(`/${room}`)
+        logger.debug(`${name}加入${room}号房间,人数:${ROOMS[room].length}`);
+    },
+    message: (socket, message,isBinary) => {
+        // 转发消息
+        const { url } = socket
+        if (!url) return
+        const room = url.split('/')[1]
+        socket.publish(`/${room}`, message,isBinary);
+
+        // buffer | string | blob
+        // const txt = Buffer.from(message).toString()
+        // console.log('接受消息',message,isBinary);
+        // socket.send(message,isBinary)
+    },
+    close: (socket, code) => {
+        // 连接关闭
+        const { url } = socket
+        if (url) {
+            const prams = url.split('/')
+            if (prams.length <= 1) return
+            // 移除
+            const ID = prams[1]
+            const Name = prams[2]
+            const isHave = ROOMS[ID].indexOf(Name)
+            if (isHave != -1) {
+                ROOMS[ID].splice(isHave, 1)
+                if (!ROOMS[ID].length) delete ROOMS[ID]
+            }
+        }
+        console.log('断开',ROOMS);
+        logger.debug(`所有房间:${JSON.stringify(ROOMS)}`);
+    }
+}).listen(49800, token => {
+    token ? logger.debug(`socket服务启动:49800`) : logger.debug(`socket服务启动失败`);
+})