{"id":15893800,"url":"https://github.com/chinanf-boy/shadowsocks-over-websocket-explain","last_synced_at":"2026-04-28T20:03:52.539Z","repository":{"id":90548531,"uuid":"118437474","full_name":"chinanf-boy/shadowsocks-over-websocket-explain","owner":"chinanf-boy","description":"explain : shadowsocks-js 实现 heroku 部署 use Server:ws Local:net","archived":false,"fork":false,"pushed_at":"2018-02-01T14:22:45.000Z","size":24,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-08T08:47:13.539Z","etag":null,"topics":["explain","net","shadowsocks","ws"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chinanf-boy.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-22T09:45:55.000Z","updated_at":"2022-01-16T02:49:16.000Z","dependencies_parsed_at":"2023-07-18T16:01:50.514Z","dependency_job_id":null,"html_url":"https://github.com/chinanf-boy/shadowsocks-over-websocket-explain","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fshadowsocks-over-websocket-explain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fshadowsocks-over-websocket-explain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fshadowsocks-over-websocket-explain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fshadowsocks-over-websocket-explain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chinanf-boy","download_url":"https://codeload.github.com/chinanf-boy/shadowsocks-over-websocket-explain/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246866100,"owners_count":20846496,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["explain","net","shadowsocks","ws"],"created_at":"2024-10-06T08:13:45.052Z","updated_at":"2026-04-28T20:03:47.506Z","avatar_url":"https://github.com/chinanf-boy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# shadowsocks-over-websocket\n\n免费使用 `Heroku` 部署 `shadowsocks`\n\n[![explain](http://llever.com/explain.svg)](https://github.com/chinanf-boy/Source-Explain)\n    \nExplanation\n\n\u003e \"version\": \"1.0.0\"\n\n[github source](https://github.com/VincentChanX/shadowsocks-over-websocket)\n\n~~[english](./README.en.md)~~\n\n---\n\nshadowsocks 的实现不再少数-分 [本地](./shadowsocks-over-websocket/local.js) 和 [服务器](./shadowsocks-over-websocket/server.js)\n\n\u003e 不过这次，见猎心喜-似乎写得很漂亮\n\n---\n\n## 目录\n\n- [👨server.js](#服务器-server)\n\n- [👧local.js](#本地-local)\n\n- [协议主代码-tcprelay](./tcprelay.readme.md)\n\n- [其他](#其他)\n\n---\n\n## 服务器-server\n\n[server.js](./shadowsocks-over-websocket/server.js)\n\n### require-导入\n\n代码 1-6\n\n``` js\nconst TCPRelay = require('./tcprelay').TCPRelay; \n// 协议主内容，后续\nconst server = require('commander'); // 命令解析\nconst constants = require('./constants'); // 版本\nconst throng = require('throng'); \n// 集群化Node.js应用程序的简单工作管理器 \nconst log4js = require('log4js'); // 日志记录\n// log4js 包含 node 与 browser, 而这个\n// 去掉了浏览器部分，只专注-node\n\nconst logger = log4js.getLogger('server');\n// 新建-server-示例\n```\n\n- constants\n\n``` js\nconst VERSION = '0.1.8';\n\nmodule.exports.VERSION = VERSION;\n```\n\n---\n\n### commander-命令解析\n\n代码 8-16\n\n``` js\nserver\n    .version(constants.VERSION)\n    .option('-m --method \u003cmethod\u003e', 'encryption method, default: aes-256-cfb')\n    .option('-k --password \u003cpassword\u003e', 'password')\n    .option('-s --server-address \u003caddress\u003e', 'server address')\n    .option('-p --server-port \u003cport\u003e', 'server port, default: 8388')\n    .option('--log-level \u003clevel\u003e', 'log level(debug|info|warn|error|fatal)', /^(debug|info|warn|error|fatal)$/i, 'info')\n    .option('--log-file \u003cfile\u003e', 'log file')\n    .parse(process.argv);\n```\n\n配置选项-commander \u003e 会把 `--server-address ` --\u003e `server.serverAddress`\n\n- `method` \u003e 密码加密方式\n\n- `password` \u003e 密码\n\n- `serverPort` \u003e 服务器端口 「 heroku 的 端口 转移-\u003e 80 」\n\n- `serverAddress` \u003e 服务器网址 「 xxx.herokuapp.com 」\n\n- `logLevel` \u003e 日志等级\n\n- `logFile` \u003e 日志文件\n\n---\n\n### 任务管理-throng\n\n`throng` 可以多进程运作\n\n代码 18-22\n\n``` js\nthrong({\n    workers: process.env.WEB_CONCURRENCY || 1,\n    master: startMaster,\n    start: startWorker\n});\n```\n\n- `workers` \u003e 进程数量\n\n- `startMaster` \u003e 主进程 \n\n``` js\nfunction startMaster() {\n    logger.info('started master');\n}\n```\n\n- [`startWorker` \u003e 子进程](#子进程-startWorker)\n\n---\n\n## 子进程-startWorker\n\n``` js\nfunction startWorker(id) {\n    logger.info(`started worker ${id}`);\n    var relay = new TCPRelay({\n        serverAddress: process.env['SERVER_ADDRESS'] || server.serverAddress || '127.0.0.1',\n        serverPort: process.env['PORT'] || server.serverPort || 8388,\n        password: process.env['PASSWORD'] || server.password || 'shadowsocks-over-websocket',\n        method: process.env['METHOD'] || server.method || 'aes-256-cfb'\n    }, false);\n\n    relay.setLogLevel(server.logLevel);\n    relay.setLogFile(server.logFile);\n    relay.setServerName('server-' + id);\n    relay.bootstrap();\n}\n```\n\n- [`TCPRelay` \u003e socks-协议](./tcprelay.readmd.md)\n\n---\n\n\n---\n\n## 本地-local\n\n[local.js](./shadowsocks-over-websocket/local.js)\n\n### require-commander\n\n代码 1-15\n\n``` js\nconst TCPRelay = require('./tcprelay').TCPRelay;\nconst local = require('commander'); // 命令解析\nconst constants = require('./constants'); // 版本\n\nlocal\n    .version(constants.VERSION)\n    .option('-m --method \u003cmethod\u003e', 'encryption method, default: aes-256-cfb')\n    .option('-k --password \u003cpassword\u003e', 'password')\n    .option('-s --server-address \u003caddress\u003e', 'server address')\n    .option('-p --server-port \u003cport\u003e', 'server port, default: 8388')\n    .option('-b --local-address \u003caddress\u003e', 'local binding address, default: 127.0.0.1')\n    .option('-l --local-port \u003cport\u003e', 'local port, default: 1080')\n    .option('--log-level \u003clevel\u003e', 'log level(debug|info|warn|error|fatal)', /^(debug|info|warn|error|fatal)$/i, 'info')\n    .option('--log-file \u003cfile\u003e', 'log file')\n    .parse(process.argv);\n```\n\n\n- `method` \u003e 密码加密方式\n\n- `password` \u003e 密码\n\n- `serverPort` \u003e 服务器端口 「 heroku 的 端口 转移-\u003e 80 」\n\n- `serverAddress` \u003e 服务器网址 「 xxx.herokuapp.com 」\n\n- `logLevel` \u003e 日志等级\n\n- `logFile` \u003e 日志文件\n\n- `localAddress` \u003e 本地网址 - `127.0.0.1`\n\n- `localPort` \u003e 本地端口\n\n---\n\n### socks-协议\n\n代码 17-27\n\n``` js\nvar relay = new TCPRelay({\n    localAddress: local.localAddress || '127.0.0.1',\n    localPort: local.localPort || 1080,\n    serverAddress: local.serverAddress || '127.0.0.1',\n    serverPort: local.serverPort || 8388,\n    password: local.password || 'shadowsocks-over-websocket',\n    method: local.method || 'aes-256-cfb'\n}, true);\nrelay.setLogLevel(local.logLevel);\nrelay.setLogFile(local.logFile);\nrelay.bootstrap();\n```\n\n- [`TCPRelay` \u003e socks-协议](./tcprelay.readmd.md)\n\n---\n\n## 其他\n\n- [throng 多进程开启](https://github.com/hunterloftis/throng)\n\n- [log4js 日志记录](https://github.com/log4js-node/log4js-node)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fshadowsocks-over-websocket-explain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchinanf-boy%2Fshadowsocks-over-websocket-explain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fshadowsocks-over-websocket-explain/lists"}