前言
什么是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