share-image
ESC

使用WebSocketd 测试websocket协议

什么是 Websocket

传统的 http 协议通信只能由客户端发起,并且它是一个单向请求,这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用”轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其他特点包括:

  • 建立在 TCP 协议之上,服务器端的实现比较容易。

  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

  • 数据格式比较轻量,性能开销小,通信高效。

  • 可以发送文本,也可以发送二进制数据。

  • 没有同源限制,客户端可以与任意服务器通信。

  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

如:

ws://example.com:80/some/path

websocket 客户端 API

参考 developer.mozilla.org

websocketd

WebSocket 服务器 Websocketd 最大特点,就是后台脚本不限语言,标准输入(stdin)就是 WebSocket 的输入,标准输出(stdout)就是 WebSocket 的输出。

下载

点击这里下载

解压

[root@centos ~]# ls
counter.sh websocketd-0.3.0-linux_amd64.zip
[root@centos ~]# unzip websocketd-0.3.0-linux_amd64

创建一个连接

1.先准备一个脚本

[root@centos ~]# cat counter.sh
#!/bin/bash

echo 1
sleep 1

echo 2
sleep 1

echo 3

2.设置监听端口并执行脚本


[root@centos ~]# ./websocketd --port=80 bash ./counter.sh

客户端

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
var ws = new WebSocket('ws://59.111.110.90:80/');
ws.onmessage = function(event) {
console.log(event.data);
};
</script>
</head>
<body>
</body>
</html>

刷新页面在console 中会打印

服务端


Fri, 19 Jan 2018 09:43:14 +0800 | INFO | server | | Serving using application : /usr/bin/bash ./counter.sh
Fri, 19 Jan 2018 09:43:14 +0800 | INFO | server | | Starting WebSocket server : ws://centos.novalocal:80/
Fri, 19 Jan 2018 09:46:08 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326368262661241' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' | CONNECT
Fri, 19 Jan 2018 09:46:10 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326368262661241' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' pid:'948' | DISCONNECT
Fri, 19 Jan 2018 09:46:17 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326377566650836' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' | CONNECT
Fri, 19 Jan 2018 09:46:19 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326377566650836' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' pid:'955' | DISCONNECT
Fri, 19 Jan 2018 09:49:51 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326591176543193' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' | CONNECT
Fri, 19 Jan 2018 09:49:53 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326591176543193' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' pid:'1002' | DISCONNECT
Fri, 19 Jan 2018 09:49:56 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326596164276971' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' | CONNECT
Fri, 19 Jan 2018 09:49:58 +0800 | ACCESS | session | url:'http://59.111.110.90/' id:'1516326596164276971' remote:'10.173.32.233' command:'/usr/bin/bash' origin:'file://' pid:'1007' | DISCONNECT

文章作者:阿文
文章链接: https://www.awen.me/post/40121.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客
本文于 2018-01-19 发布,已超过半年(2932天),请注意甄别内容是否已过期。