前言
什麼是WebSocket?
WebSocket 是一種網絡通信協議, 協議在2008年誕生,2011年成爲國際標準。所有瀏覽器都已經支持了。最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話。
與http有何差異?
HTTP 協議設計之初規定通信只能由客戶端發起,然後由服務器返回查詢結果。所以如果服務器端如果有連續的狀態需要下發,那麼就只能通過客戶端不斷的輪詢了,這樣的化,整個通信的過程的效率就會大打折扣。而WebSocket建立在TCP/IP協議之上的應用層協議,區別與http單向的通信,客戶端和服務器可以實現真正的雙向平等對話。
一、環境及工具
- 16.04.1-Ubuntu
- joewalnes/websocketd
websocketd
一個WebSocket server可以使用任意的服務端編程語言來實現,只要該語言能實現基本的Berkeley sockets(伯克利套接字)。例如c(++)、Python、PHP、服務端JavaScript(node.js),這些語言都可以用來實現,這裏我們選擇了websocketd,具體關於websocketd的信息可以點擊前面的超鏈接。
二、搭建測試環境
1. 下載websocketd
現在github下載對應環境版本的可執行文件:
websocketd-0.3.0-linux_amd64.zip
$ ll
total 7.1M
-rw-rw-r-- 1 peng peng 1.5K 12月 25 2017 CHANGES
-rw-rw-r-- 1 peng peng 1.3K 12月 25 2017 LICENSE
-rw-rw-r-- 1 peng peng 4.8K 12月 25 2017 README.md
-rwxrwxr-x 1 peng peng 7.1M 12月 25 2017 websocketd
2. 編寫一個後臺腳本
我主要實現一個功能就是打印一段話就OK!
#!/bin/bash
echo "Hello,I websocketd."
sleep 1
echo "My OS is ubuntu16.04."
sleep 1
- 編寫一個測試HTML文件
<!DOCTYPE html>
<pre id="log"></pre>
<script>
// helper function: log message to screen
function log(msg) {
document.getElementById('log').textContent += msg + '\n';
}
// setup websocket with callbacks
var ws = new WebSocket('ws://localhost:8080/');
ws.onopen = function() {
log('CONNECT');
};
ws.onclose = function() {
log('DISCONNECT');
};
ws.onmessage = function(event) {
log('MESSAGE: ' + event.data);
};
</script>
- 修改腳本權限
sudo chmod +x test.sh
三、測試
- 終端啓動websocketd
./websocketd --port=8080 ./test.sh
Mon, 12 Aug 2019 14:30:33 +0800 | INFO | server | | Serving using application : ./test.sh
Mon, 12 Aug 2019 14:30:33 +0800 | INFO | server | | Starting WebSocket server : ws://TM1705:8080/
- 瀏覽器打開HTML文件
$ ./websocketd --port=8080 ./test.sh
Mon, 12 Aug 2019 14:30:33 +0800 | INFO | server | | Serving using application : ./test.sh
Mon, 12 Aug 2019 14:30:33 +0800 | INFO | server | | Starting WebSocket server : ws://TM1705:8080/
Mon, 12 Aug 2019 14:31:40 +0800 | ACCESS | session | url:'http://localhost:8080/' id:'1565591500532840292' remote:'::1' command:'./test.sh' origin:'file://' | CONNECT
Mon, 12 Aug 2019 14:31:42 +0800 | ACCESS | session | url:'http://localhost:8080/' id:'1565591500532840292' remote:'::1' command:'./test.sh' origin:'file://' pid:'16565' | DISCONNECT