websocketd

websocketd

http://websocketd.com/

举例:

10 second tutorial

举例来说,下面是一个 Bash 脚本counter.sh

1
2
3
4
5
6
7
#!/bin/bash

# Count from 1 to 10 with a sleep
for ((COUNT = 1; COUNT <= 10; COUNT++)); do
echo $COUNT
sleep 0.5
done

或者python版本(也可以其它版本)

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
from sys import stdout
from time import sleep

# Count from 1 to 10 with a sleep
for count in range(0, 10):
print(count + 1)
stdout.flush()
sleep(0.5)

或者C版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <unistd.h>

int main() {
int i;

// Disable output buffering.
setbuf(stdout, NULL);

for (i = 1; i <= 10; i++) {
printf("%d\n", i);
usleep(500000);
}

return 0;
}

命令行下运行这个脚本,会输出1、2、3、…,每个值之间间隔0.5秒。

1
2
3
4
5
6
7
8
9
10
11
$ bash ./counter.sh
1
2
3
4
5
6
7
8
9
10

现在,启动websocketd,指定这个脚本作为服务。

1
$ websocketd --port=8080 bash ./counter.sh

上面的命令会启动一个 WebSocket 服务器,端口是8080。每当客户端连接这个服务器,就会执行counter.sh脚本,并将它的输出推送给客户端。

然后启动客户端,连接客户端的程序到服务器端:

server.js:

1
2
3
4
5
6
const WebSocket = require('ws');
var ws = new WebSocket('ws://localhost:8080/');

ws.onmessage = function(event) {
console.log('Count is: ' + event.data);
};

在命令行窗口执行 node server.js

(比如报错 JavaScript - ReferenceError: WebSocket is not defined 则 在命令行窗口执行 npm i ws

客户端返回 counter.sh的输出。

服务端显示:

1
2
3
4
5
Mon, 06 Mar 2023 10:07:40 +0800 | INFO   | server     |  | Serving using application   : /usr/bin/bash ./counter.sh
Mon, 06 Mar 2023 10:07:40 +0800 | INFO | server | | Starting WebSocket server : ws://LAPTOP-D2HCBJT4:8080/

Mon, 06 Mar 2023 10:40:10 +0800 | ACCESS | session | url:'http://localhost:8080/' id:'1678070410339596900' remote:'127.0.0.1' command:'/usr/bin/bash' origin:'file:' | CONNECT
Mon, 06 Mar 2023 10:40:12 +0800 | ACCESS | session | url:'http://localhost:8080/' id:'1678070410339596900' remote:'127.0.0.1' command:'/usr/bin/bash' origin:'file:' pid:'837' | DISCONNECT