
WebSocketd 是WebSocket的守护进程(命令行工具),负责处理WebSocket连接,并启动服务器应用程序来处理WebSockets,在应用程序和Web浏览器之间传递消息,无需任意依赖包且进程独立。WebSocketd是一款非常特别的WebSocket服务器,它的最大特点是后台脚本不限语言,其标准输入stdin就是WebSocket的输入,标准输出stdout就是WebSocket的输出。
安装
// 下载
wget https://github.com/joewalnes/websocketd/releases/download/v0.4.1/websocketd-0.4.1-linux_amd64.zip
// 解压
unzip websocketd-v0.4.1-linux_amd64.zip
解压后生成这个文件:websocketd
输入
help
查看看是否配置合适,如下所示:
./websocketd -version
websocketd 0.4.1 (go1.15.7 linux-amd64)
简单示例
shell脚本
计数器 counter.sh
#!/bin/bash
for ((COUNT = 1; COUNT <= 10; COUNT++)); do
echo $COUNT
sleep 1
done
启动websocketd
chmod 777 counter.sh
/var/www/websocketd/websocketd --port=8888 /var/www/websocketd/counter.sh
上面的命令会启动一个 WebSocket 服务器,端口是8888
。每当客户端连接这个服务器,就会执行counter.sh
脚本,并将它的输出推送给客户端。
预览
控制台
var ws = new WebSocket('ws://127.0.0.1:8888/');
ws.onopen = function() {
console.log('CONNECT');
};
ws.onclose = function() {
console.log('DISCONNECT');
ws.close();
};
ws.onmessage = function(event) {
console.log('MESSAGE: ' + event.data);
};

HTML文件
<!doctype html>
<html lang="">
<head>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>开源技术小栈</title>
</head>
<body>
<h2>websocketd 客户端测试</h2>
<pre id="message" style="font-size: 24px;"></pre>
<script>
function log(msg) {
document.getElementById('message').textContent += msg + 'n';
}
var ws = new WebSocket('ws://127.0.0.1:8888/');
ws.onopen = function() {
console.log('CONNECT');
};
ws.onclose = function() {
console.log('DISCONNECT');
ws.close();
};
ws.onmessage = function(event) {
console.log('MESSAGE: ' + event.data);
log('websocketd服务端响应:'+event.data);
};
</script>
</body>
</html>

服务端打印日志
/var/www/websocketd # /var/www/websocketd/websocketd --port=8888 /var/www/websocketd/counter.sh
Sun, 24 Dec 2023 10:54:15 +0800 | INFO | server | | Serving using application : /var/www/websocketd/counter.sh
Sun, 24 Dec 2023 10:54:15 +0800 | INFO | server | | Starting WebSocket server : ws://4bc07756b82c:8888/
Sun, 24 Dec 2023 10:54:32 +0800 | ACCESS | session | url:'http://127.0.0.1:8888/' id:'1703386472745570850' remote:'172.18.0.1' command:'/var/www/websocketd/counter.sh' origin:'file:' | CONNECT
Sun, 24 Dec 2023 10:54:42 +0800 | ACCESS | session | url:'http://127.0.0.1:8888/' id:'1703386472745570850' remote:'172.18.0.1' command:'/var/www/websocketd/counter.sh' origin:'file:' pid:'316' | DISCONNECT
实时监控内存信息
shell脚本
系统内存脚本 system_info.sh
#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
SHELL_DIR="/var/www/websocketd"
SHELL_NAME="system_info"
SHELL_TIME=$(date '+%Y-%m-%d')
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}-${SHELL_TIME}.log"
REDIS_MEMORY_KEYS_NAME="REDIS_MEMORY_INFO:001"
REDIS_DISH_KEYS_NAME="REDIS_DISH_INFO:001"
while(true)
do
FIND_DATA=$(cat /proc/meminfo | grep "MemFree:" | awk '{print $2}')
echo "[$SHELL_TIME]: FIND_DATA = $FIND_DATA INSERT_RES = ${INSERT_RES} CUT_LIST_LEN = ${CUT_LIST_LEN}" >> $SHELL_LOG
echo '{"data":'"${FIND_DATA}"',"errcode":0,"errmsg":0}'
sleep 2
done
启动websocketd
chmod 777 counter.sh
/var/www/websocketd/websocketd --port=8888 /var/www/websocketd/counter.sh
HTML页面
<!doctype html>
<html lang="">
<head>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>开源技术小栈</title>
</head>
<body>
<h2>websocketd 客户端测试</h2>
<pre id="message" style="font-size: 24px;"></pre>
<script>
function log(msg) {
document.getElementById('message').textContent += msg + 'n';
}
var ws = new WebSocket('ws://127.0.0.1:8888/');
ws.onopen = function() {
console.log('CONNECT');
};
ws.onclose = function() {
console.log('DISCONNECT');
ws.close();
};
ws.onmessage = function(event) {
console.log('MESSAGE: ' + event.data);
log('websocketd服务端响应:'+event.data);
};
</script>
</body>
</html>
运行效果

参数配置
–staticdir=
--staticdir=
允许websocketd作为静态文件提供counter.html
count.sh
文件
#!/bin/bash
for COUNT in $(seq 1 10); do
echo $COUNT
sleep 1
done
count.html
文件
<!DOCTYPE html>
<html>
<head>
<title>websocketd count example</title>
<style>
#count {
font: bold 150px arial;
margin: auto;
padding: 10px;
text-align: center;
}
</style>
</head>
<body>
<div id="count"></div>
<script>
var ws = new WebSocket('ws://127.0.0.1:8888/');
ws.onopen = function() {
document.body.style.backgroundColor = '#cfc';
};
ws.onclose = function() {
document.body.style.backgroundColor = null;
};
ws.onmessage = function(event) {
document.getElementById('count').textContent = event.data;
};
</script>
</body>
</html>
运行websocketd。注意参数
--staticdir=. ./count.sh
/var/www/websocketd # /var/www/websocketd/websocketd --port=8888 --staticdir=. ./count.sh
Sun, 24 Dec 2023 11:29:57 +0800 | INFO | server | | Serving using application : ./count.sh
Sun, 24 Dec 2023 11:29:57 +0800 | INFO | server | | Serving static content from : .
Sun, 24 Dec 2023 11:29:57 +0800 | INFO | server | | Starting WebSocket server : ws://4bc07756b82c:8888/
Sun, 24 Dec 2023 11:29:57 +0800 | INFO | server | | Serving CGI or static files : http://4bc07756b82c:8888/
Sun, 24 Dec 2023 11:30:01 +0800 | ACCESS | http | url:'http://127.0.0.1:8888/count.html' | STATIC
Sun, 24 Dec 2023 11:30:01 +0800 | ACCESS | session | url:'http://127.0.0.1:8888/' id:'1703388601564733656' remote:'172.18.0.1' command:'./count.sh' origin:'http://127.0.0.1:8888' | CONNECT
Sun, 24 Dec 2023 11:30:11 +0800 | ACCESS | session | url:'http://127.0.0.1:8888/' id:'1703388601564733656' remote:'172.18.0.1' command:'./count.sh' origin:'http://127.0.0.1:8888' pid:'3571' | DISCONNECT
访问地址:http://127.0.0.1:8888/count.html

开发者模式
为了帮助开发、调试和测试,websocketd包括一个开发人员控制台,使您可以轻松地与WebSocket端点进行交互,而无需编写JavaScript。要启用控制台,请在websocketd命令行选项中添加 --devconsole
。
运行websocketd
/var/www/websocketd/websocketd --port=8888 --dir=/var/www/websocketd --devconsole
浏览器访问:http://127.0.0.1:8888/counter.sh

其他
守护进程运行
nohup /var/www/websocketd/websocketd --port=8888 /var/www/websocketd/system_info.sh >/dev/null 2>&1 &
证书加载
sudo websocketd
--port=8888
--ssl
--sslcert="/etc/letsencrypt/live/www.tinywan.com/fullchain.pem"
--sslkey="/etc/letsencrypt/live/www.tinywan.com//privkey.pem"
/var/www/websocketd/system.sh
Nginx代理配置
server {
listen 443 ssl http2;
server_name wallet.tinywan.com;
ssl_certificate /etc/letsencrypt/wallet.tinywan.com/full_chain.pem;
ssl_certificate_key /etc/letsencrypt/wallet.tinywan.com/private.key;
location /wssd
{
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 600;
}
}
连接方式
var ws = new WebSocket('wss://wallet.tinywan.com/wssd');
原文始发于微信公众号(开源技术小栈):「IM系列」WebSocket教程:跨语言 WebSocketd 让实时通信更简单!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/247893.html