官方地址:https://github.com/joewalnes/websocketd

  websocketd是WebSocket守护进程,它负责处理WebSocket连接,启动您的程序来处理WebSockets,并在程序和Web浏览器之间传递消息。

一、安装:websocketd

wget https://github.com/joewalnes/websocketd/releases/download/v0.2.12/websocketd-0.2.12-linux_amd64.zipunzip  websocketd-0.2.12-linux_amd64.zip

解压后生成这个文件:websocketd

复制该文件到 /usr/bin目录下,修改环境变量

sudo cp websocketd /usr/bin/websocketdsudo vim /etc/profileexport  PATH=$PATH:/usr/bin/websocketd

可能出现的错误:如果修改了/etc/profile,那么编辑结束后执行source profile 或 执行点命令 ./profile,PATH的值就会立即生效了,但是会提示以下错误:

#source /etc/profile   之后为什么会出现
command not found 

解决办法,直接切换到root 用户模式既可,再次执行source profile 就可以了,输入help 看是否配置合适,如下所示:

tinywan@tinywan:~/shell$ websocketd --help
websocketd (0.2.12 (go1.6 linux-amd64) --)websocketd is a command line tool that will allow any executable program
that accepts input on stdin and produces output on stdout to be turned into
a WebSocket server.Usage:Export a single executable program a WebSocket server:websocketd [options] COMMAND [command args]Or, export an entire directory of executables as WebSocket endpoints:websocketd [options] --dir=SOMEDIROptions:--port=PORT                    HTTP port to listen on.--address=ADDRESS              Address to bind to (multiple options allowed)Use square brackets to specify IPv6 address. Default: "" (all)

二、开启WebSocketd 服务

tinywan@tinywan:~/shell$ websocketd --port=63800 ./count.sh
Mon, 08 May 2017 17:26:50 +0800 | INFO   | server     |  | Serving using application   : ./count.sh
Mon, 08 May 2017 17:26:50 +0800 | INFO   | server     |  | Starting WebSocket server   : ws://tinywan:8080/

测试代码:count.sh

#!/bin/bash
for ((COUNT = 1; COUNT <= 10; COUNT++)); doecho $COUNTsleep 1
done

运行脚本时你可能会遇到以下错误:

root@TinywanAliYun:/home/www/bin# websocketd --port=63800 ./count.sh
Unable to locate specified COMMAND './count.sh' in OS path.Usage:Export a single executable program a WebSocket server:websocketd [options] COMMAND [command args]Or, export an entire directory of executables as WebSocket endpoints:websocketd [options] --dir=SOMEDIROr, show extended help message using:websocketd --help

请赋予权限,使其可执行:

$ chmod +x ./count.sh

随便打开一个浏览器,在console中输入一下代码测试:

var ws = new WebSocket('ws://192.168.18.12:63800/');
ws.onopen = function() {console.log('CONNECT');
};
ws.onclose = function() {console.log('DISCONNECT');
};
ws.onmessage = function(event) {console.log('MESSAGE: ' + event.data);
};

(1)测试结果如下所示:

  

(2)新建立一个客户端测试client.html

<!doctype html>
<html lang="">
<head><meta charset="utf-8"><meta name="description" content=""><meta name="viewport" content="width=device-width, initial-scale=1"><meta http-equiv="x-ua-compatible" content="ie=edge"><title>websocketd</title>
</head>
<body>
<h2>websocketd 客户端的简单测试</h2>
<pre id="log"></pre>
<script>// helper function: log message to screenfunction log(msg) {document.getElementById('log').textContent += msg + '\n';}// setup websocket with callbacksvar ws = new WebSocket('ws://192.168.18.12:8080/');ws.onopen = function() {console.log('CONNECT');};ws.onclose = function() {console.log('DISCONNECT');};ws.onmessage = function(event) {console.log('MESSAGE: ' + event.data);};
</script>
</body>
</html>

在查看结果信息,查看结果已经ok

查看服务端信息

我本机IP地址为,也就是client.html客户端

websocketd --port=9501 --devconsole luajit ./json_ws.lua

》》》实际案例,使用WebSocketd 实时监控内存信息

1、编写脚本,system_info_send_websocketd.sh

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/binSHELL_DIR="/home/www/bin"
SHELL_NAME="system_info_websocketd"
SHELL_TIME=$(date '+%Y-%m-%d')
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}-${SHELL_TIME}.log"REDIS_MEMORY_KEYS_NAME="REDIS_MEMORY_INFO:001"
REDIS_DISH_KEYS_NAME="REDIS_DISH_INFO:001"while(true)doFIND_DATA=$(cat /proc/meminfo | grep "MemFree:" | awk '{print $2}')echo  "[$SHELL_TIME]: FIND_DATA = $FIND_DATA INSERT_RES = ${INSERT_RES} CUT_LIST_LEN = ${CUT_LIST_LEN}" >> $SHELL_LOGecho   '{"data":'"${FIND_DATA}"',"errcode":0,"errmsg":0}'sleep 2
done

2、客户端实时监控代码:

<div class="panel-footer" id="container" style="width: 100%; height: 400px; margin: 0 auto"></div>
<script language="JavaScript">//数据获取var moniServerIp = "{{moniServerIp}}";var moniServerSshUsername = "{$moniServerSshUsername}";var moniServerSshPassword = "{$moniServerSshPassword}";var wsServerIP = "127.0.0.1";var wsServerPort = "12380";var moniMehtod = "server02";var moniInterval = 1;var moniDataUnit = 'MB';var wsData = 0.0;wsSend = {"action": moniMehtod,"name": "tinywan",};$(document).ready(function () {//----------WebSocket部分--------------var ws = new WebSocket("ws://" + wsServerIP + ":" + wsServerPort);ws.onopen = function () {ws.send(JSON.stringify(wsSend));};ws.onclose = function () {console.log('链接已断开');ws.close();};ws.onmessage = function (e) {var response = JSON.parse(e.data);if (Number(response.errcode) !== 0) {console.log(String(response.errmsg));ws.close();alert('出错啦!' + String(response.errmsg));return;}var divisor = 1;switch (moniDataUnit.toLocaleLowerCase()) {case 'mb':divisor = 1024;break;}wsData = response.data / divisor;console.log("收到服务端的消息:" + wsData);};//----------highcharts的图标插件部分--------------Highcharts.setOptions({global: {useUTC: false}});$('#container').highcharts({chart: {type: 'spline',animation: Highcharts.svg, // don't animate in old IEmarginRight: 10,events: {load: function () {// set up the updating of the chart each secondvar series = this.series[0];setInterval(function () {// current timevar x = (new Date()).getTime(),y = wsData * 1.00;series.addPoint([x, y], true, true);}, 2000);}}},title: {text: '服务器【' + moniServerIp + '】内存指标(单位:' + moniDataUnit + ')'},xAxis: {type: 'datetime',tickPixelInterval: 150},yAxis: {title: {text: 'MemFree'},plotLines: [{value: 0,width: 1,color: '#808080'}]},tooltip: {formatter: function () {return '<b>' + this.series.name + '</b><br/>' +Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +Highcharts.numberFormat(this.y, 2);}},legend: {enabled: false},exporting: {enabled: false},series: [{name: 'MemFree指标',data: (function () {// generate an arrayvar data = [],time = (new Date()).getTime(),i;for (i = -19; i <= 0; i += 1) {data.push({x: time + i * 1000,y: wsData});}return data;}())}]});});
</script>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>

3、测试结果:

4、客户端可能会出现超时链接的,可以使用 ReconnectingWebSocket

 var ws = new ReconnectingWebSocket("ws://" + wsServerIP + ":" + wsServerPort);

》》》》》》》》》》》》 参数详解

(1)参数一:--staticdir=.

--staticdir=.  Allow websocketd to serve count.html as a static file
//允许websocketd作为静态文件提供count.html

这个参数是什么意思来,就是在当前项目指定通知执行的语言脚本文件(count.sh)同名的count.html作为静态文件,直接使用http访问

当前目录

count.sh 文件 (tinywan@tinywan:~/Go/websocket$ cat count.sh)

#!/bin/bash
# Count from 1 to 10, pausing for a second between each iteration.
for COUNT in $(seq 1 10); doecho $COUNTsleep 1
done

count.html 文件

<!DOCTYPE html>
<html><head><title>websocketd count example</title><style>#count {font: bold 150px arial;margin: auto;padding: 10px;text-align: center;}</style></head><body><div id="count"></div><script>var ws = new WebSocket('ws://192.168.18.180:8080/');ws.onopen = function() {document.body.style.backgroundColor = '#cfc';};ws.onclose = function() {document.body.style.backgroundColor = null;};ws.onmessage = function(event) {document.getElementById('count').textContent = event.data;};</script></body>
</html>

打开谷歌浏览器,在地址栏输入:http://192.168.18.180:8080/

  

点击count.html后的效果图

  

(2)参数二: --devconsole

  该--devconsole标志使内置的控制台websocketd与WebSocket端点手动交互。

  指向浏览器http://localhost:8080/,您将看到控制台。按复选框连接。

请注意,您不能同时使用--devconsole和--staticdir。开发控制台旨在提供临时用户界面,直到您构建了真实的用户界面。

开始测试:

  

打开浏览器测试,发送一个空数据是没办法发送的,由于我们没有指定开启那个一个语言脚本文件充当WebSocket 服务器,为我们提供客户端的服务

  

指定/home/tinywan/Go/websocket 目录下的 count.sh 作为服务文件,继续测试的结果如下所示

  

Websocket 代理服务器

1、没代理之前访问

var ws = new WebSocket('ws://192.168.18.188:63800');
ws.onopen = function() {console.log('CONNECT');
};
ws.onclose = function() {console.log('DISCONNECT');
};
ws.onmessage = function(event) {console.log('MESSAGE: ' + event.data);
};

2、代理之后访问

var ws = new WebSocket('ws://192.168.18.188:8087/chat/');
ws.onopen = function() {console.log('CONNECT');
};
ws.onclose = function() {console.log('DISCONNECT');
};
ws.onmessage = function(event) {console.log('MESSAGE: ' + event.data);
};

守护进程运行

nohup websocketd --port=63800 /home/www/bin/system_info_send_all_websocketd.sh >/dev/null  2>&1 &

加载证书

 sudo websocketd --port=6500 --ssl --sslcert="/etc/letsencrypt/live/www.tinywan.top/fullchain.pem" --sslkey="/etc/letsencrypt/live/www.tinywan.top//privkey.pem" /home/www/bin/system_info_send_all_websocketd.s

wss 协议测试

var ws = new WebSocket('wss://www.tinywan.top:6500');
ws.onopen = function() {console.log('CONNECT');
};
ws.onclose = function() {console.log('DISCONNECT');
};
ws.onmessage = function(event) {console.log('MESSAGE: ' + event.data);
};

贵在坚持,相信自己.

Github 开源项目(一)websocketd (实战:实时监控服务器内存信息)相关推荐

  1. Android最新最全100余款开源App(对应Github开源项目)

    最近整理了一些开源的APP,以及对应的一些Github开源项目,现在做一些记录,以便以后查阅. 介绍与链接 BeautifulRefreshLayout-漂亮的美食下拉刷新 https://githu ...

  2. 2018年9月机器学习Github开源项目TOP 10

    文章来源: ATYUN AI平台 在过去的一个月里,我们对将近250个机器学习开源项目排名,选出前10位. 在此期间,我们将项目与新的或主要版本进行了比较.Mybridge AI根据各种因素对项目进行 ...

  3. github开源项目免费使用Azure PipeLine

    微软收购Github后,很多人猜想微软可能会砍掉VSTS,然而事实VSTS并没有砍掉,关于Azure Devops的详细信息可以查看 这篇博客,如果想查看原文也可以从链接里提供的原始地址里查看. 今天 ...

  4. 推荐标星 100 K 的 GitHub 开源项目

    推荐标星 100 K 的 GitHub 开源项目 原文见:推荐 10 个标星 100 K 的 GitHub 开源项目 以下摘录部分: Build Your Own X (GitHub Star:102 ...

  5. GitHub开源项目 - Jeecg-Boot开始开发平台介绍

    GitHub开源项目 - Jeecg-Boot开始开发平台介绍 Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Mybatis ...

  6. 【UI学习】Android github开源项目,酷炫自定义控件(View)汇总

    [UI学习]Android github开源项目,酷炫自定义控件(View)汇总 转载  2016年09月04日 23:23:15 3484 近期整理的比较酷炫并且我们会经常用到的custom vie ...

  7. (4.2.0)GitHub开源项目收集

    (4.2.0)GitHub开源项目收集 2016年09月24日 16:45:051543人阅读 评论(0) 收藏 举报  分类: 4.2-android开源组件(98)  版权声明:本文为博主原创文章 ...

  8. [Android开源项目] GitHub开源项目总结 (转)

    [Android开源项目] GitHub开源项目总结 GitHub开源项目android-styled-dialogs http://neast.cn/forum.php?mod=viewthread ...

  9. 如何参与一个GitHub开源项目

    Github作为开源项目的著名托管地,可谓无人不知,越来越多的个人和公司纷纷加入到Github的大家族里来,为开源尽一份绵薄之力.对于个人来讲,你把自己的项目托管到Github上并不表示你参与了Git ...

最新文章

  1. 2.1.2 数据通信基础知识
  2. 享元模式 -- 大话设计模式
  3. 方舟服务器维护公告11月19日,明日方舟11月19日10点停机维护 更新内容一览
  4. leetcode-Combination Sum-39
  5. Java开发人员应该知道的5种错误跟踪工具
  6. 201771010101白玛次仁《面向对象程序设计(java)》第十二周实验总结
  7. UNIX环境高级编程(第三版)关于apue.h的用法
  8. 三周第四次课(12月28日)
  9. 架构师必备最全SQL优化方案
  10. 拓端tecdat|【视频】R语言生存分析原理与晚期肺癌患者分析案例|数据分享
  11. 记录自定义view的基本使用
  12. 深入理解 JVM 第三版
  13. 阿里开源软件替换指南 1
  14. 《哲学史讲演录》——思辨节选---智者派
  15. #今日论文推荐# IJCAI 2022 | 求同存异:多行为推荐的自监督图神经网络
  16. 德州学院计算机专业怎样,2017德州学院各专业录取分数线
  17. 2021最新css3面试题理论,前端css面试题,移动端面试题理论。
  18. [NOIP 2015TG D2T3] 运输计划
  19. Hulu新剧向 | 神剧归位《使女的故事》第四季高能来袭!
  20. Opencv学习笔记 - OpenCV 4机器学习算法简介

热门文章

  1. 啦啦啦 啦啦 啦 啦 啦 啦啦 啦 啦 啦
  2. ASP.NET 访问共享文件夹
  3. Quartz2D简单图形
  4. curl 支持ws吗_curl 支持 http2
  5. c语言fopen函数打不开,[讨论]用fopen函数无法打开文件有哪几种情况
  6. 24小时临时邮箱_免费临时邮箱和接码平台
  7. 扫描到服务器的文件在哪个文件夹,云服务器的文件在哪个文件夹
  8. 【控制】复杂度定义及计算
  9. 【数理知识】《数值分析》李庆扬老师-第3章-函数逼近与快速傅里叶变换
  10. 【Paper】2020_Qize_Design of UGV Trajectory Tracking Controller in UGV-UAV Cooperation