WebSocketd是WebSocket的守護進程,負責處理WebSocket連接,并啟動服務器應用程序來處理WebSockets,在應用程序和Web瀏覽器之間傳遞消息。
WebSocketd是一款非常特別的WebSocket服務器,它的最大特點是后臺腳本不限語言,其標準輸入stdin就是WebSocket的輸入,標準輸出stdout就是WebSocket的輸出。
WebSocketd本質(zhì)上是命令行的WebSocket代理,只要在命令行可以執(zhí)行的程序,都可以通過它與瀏覽器進行WebSocket通信。
WebSocketd可作為后臺服務運行,幫助處理WebSocket連接,加載應用程序處理WebSocket,在程序和瀏覽器之間傳遞消息,無需任意依賴包且進程獨立。
使用案例
使用Bash編寫服務器腳本并與瀏覽器WebSocket交互
- 創(chuàng)建腳本
使用Bash編寫腳本
$ vim test.sh
#!/bin/bash
echo 1
sleep 1
echo 2
sleep 1
echo 3
- 啟動服務
啟動WebSocketd指定腳本作為服務,websocketd命令會啟動一個WebSocket服務器并指定端口。每當客戶端連接到服務器,就會執(zhí)行對應的腳本,并將腳本的輸出推送給客戶端。
$ websocketd --port=8080 bash ./test.sh
客戶端JavaScript接口中可通過onmessage方法獲取服務器推送過來的數(shù)據(jù)。
$ vim test.js
var ws = new WebSocket("ws://localhost:8080");
ws.onmessage = function(event){
console.log(event.data);
};
可將命令行輸出發(fā)送給瀏覽器,比如執(zhí)行ls命令將當前目錄內(nèi)容發(fā)送給瀏覽器,以實時監(jiān)控服務器。
$ websocketd --port=8080 ls
使用案例
使用Python編寫服務器腳本與瀏覽器WebSocket進行交互
$ mkdir websocket && cd websocket
- 使用Python編寫服務器腳本
$ vim test.py
import time
print(1)
time.sleep(1)
print(2)
time.sleep(1)
print(3)
time.sleep(1)
- 開啟WebSocket守護進程并執(zhí)行Python腳本
$ websocketd --port=9000 python ./test.py
- 瀏覽器控制臺查看打印信息
$ vim test.html
<script>
const url = "";
let ws = new WebSocket("ws://localhost:9000");
ws.onmessage = (event)=>console.log(event.data);
</script>
使用Node.js的HTTP-Server開啟HTTP服務器
$ http-server -p 8000 ./
使用瀏覽器訪問 http://127.0.0.1:8000/test.html
命令參數(shù)
$ websocketd --staticdir=.
staticdir表示允許WebSocketd作為靜態(tài)文件提供,也就是說在當前項目指定通知執(zhí)行的語言腳本同名的Web頁面作為靜態(tài)文件。
$ websocketd --devconsole
devconsole標志會使內(nèi)置的控制臺WebSocketd與WebSocket端點進行手工交互。
devconsole與staticdir不能不同使用,內(nèi)置開發(fā)控制臺旨在提供臨時用戶界面,用于構建真實的用戶界面。
配置代理
為WebSocket配置Nginx代理服務器
$ vim test.conf
server {
listen 443 ssl http2;
server_name www.test.com;
ssl_certificate /etc/test/full_chain.pem;
ssl_certificate_key /etc/test/private.key;
location /wssd
{
proxy_pass http://lnmp-php: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;
}
}