2019独角兽企业重金招聘Python工程师标准>>>

开源WebSocket服务器 宝贝鱼(CshBBrain)发布有些日子了,很多人研究 宝贝鱼(CshBBrain) 仅仅是为了学习其中所使用到的WebSocket协议,或是其使用到的NIO,AIO技术,是学习多线程,并发包的使用。很多人也只是学习学习,研究研究,没有人想过将宝贝鱼(CshBBrain)用于项目中,因为没有看到有人使用,担心风险。

下面我就秀一下采用服务器 宝贝鱼(CshBBrain) 作为后台业务服务器,CshBBrainJS 作为前台开发数据通信框架的移动互联网应用。数码快看(http://211.100.41.186:8989/mcms/ws/index_ws_tom.html),如果你喜欢数码快看产品请到www.qook.com.cn下载iOS或Android的安装程序。由于知识产权的关系,提供的实例屏蔽了部分功能,混淆了前台代码,只支持高版本的Chrome浏览器。下面上几张图片吧:

使用CshBBrainJS 作为前台数据通信的框架与后台基于宝贝鱼(CshBBrain)的业务服务器进行数据交换。用户在使用系统的整个过程中客户端程序始终保持与业务服务器一个连接,所有请求的发送,数据的接收都通过这个连接。这就避免了采用ajax进行数据通信时,每次都必须创建一个连接,有时会在短时间内发起几十次请求,而请求发送的数据也不多,花销在创建连接上的时间却非常的客观。

使用CshBBrainJS 请求后台数据的使用方式和使用jquery的getScript函数获取数据的方式相同。CshBBrainJS 提供getData(url,callBack)函数获取数据,使用时首先设置好要连接的地址bizServer;然后调用getData获取数据,调用时传递请求的接口以及参数url和获取数据后的处理函数callBack,url的格式遵循html的get请求数据格式:接口名?a=av&b=bv,会调函数在接收到请求响应数据时由CshBBrainJS 框架自动调用,CshBBrainJS 框架自己会调度管理好每个请求的发送,数据的接收和回调函数的调用。

使用CshBBrainJS作为前台框架时,服务器返回时,必须将框架请求时传递的taskKey的值传递回来,并且约定好数据发送回来的js对象的变量名即可。下面贴上CshBBrainJS的所有代码,CshBBrainJS所有代码不压缩只有3k多点,压缩后只有1k多点。下面贴上CshBBrainJS的所有代码:

var taskCount = 1;

function socket(){

this.managerServer = "";//管理服务器地址

this.isClusters = 1;// 是否为集群websocket服务器,1:表示不是,2:表示是集群

this.bizServer = "ws://192.168.1.100:9090/";// 业务websocket服务器地址

this.bizSocket = null;// 业务websocket服务器连接

this.taskQueue = {};// 调用任务队列

this.waitQueue = new Array();// 等待调用的队列

this.taskKey = "taskKey";//任务调用key

this.tryCount = 0;// 尝试连接的次数

this.status = -1;// 业务websocket连接状态,-1:表示还没有创建连接,0:正在连接,1:表示没有连上服务器,2:正在关闭连接,3:表示已经关闭连接

var self = this;

this.init = function(){// 初始化连接

if(self.isClusters == 2){// 服务器采用集群的方式

var clusterSocket = new WebSocket(self.managerServer);

clusterSocket.onopen = function(event){

clusterSocket.send();// 获取biz地址请求

}

clusterSocket.onmessage = function(event){// 设置biz服务器地址,关闭连接

self.bizServer = event.data;

self.createBizSocket();

clusterSocket.close();

}

}else{// 服务器没有采用集群的方式

self.createBizSocket();

}

}

this.createBizSocket = function(){

self.bizSocket = new WebSocket(self.bizServer);

self.status = 0;// 正在连接中

self.bizSocket.onopen = function(event){// 连接成功

self.status = 1;// 成功连接上服务器

self.tryCount = 0;// 尝试连接的次数置空

var paramter = self.waitQueue.shift();

while(paramter){

self.taskQueue[paramter.timestamp] = paramter;

self.bizSocket.send(paramter.url);

paramter = self.waitQueue.shift();

}

}

this.bizSocket.onerror = function(event){

try{

self.bizSocket.close();

}catch(e){}

self.status = -1;// 正在关闭连接

++self.tryCount;// 尝试连接的次数

if(self.tryCount <= 10000){

// 将执行队列中的任务添加到数组中

for (prop in self.taskQueue){

self.waitQueue.unshift(self.taskQueue[prop]);

}

self.init();// 继续连接

}

//alert("连接出错");

}

/*

this.bizSocket.onclose = function(event){

this.status = -1;// 已经完成关闭操作

++this.tryCount;// 尝试连接的次数

}*/

this.bizSocket.onmessage = function(event){// 对业务服务器返回的业务代码进行处理,并调用回调函数

eval(event.data);// 执行服务器端返回的js代码

if(taskKey){// 有回调函数,则调用回调函数

try{

if(self.taskQueue[taskKey].callBack){// 存在回调函数就调用

self.taskQueue[taskKey].callBack(resultData);

}

}catch(e){

self.taskQueue[taskKey].callBack(null);

//alert("业务处理函数出现异常");

}

self.taskQueue[taskKey] = undefined;

}

//var stock = window.JSON.parse(event.data);

};

}

this.currTime = function(formatStr){// 获取系统当前时间戳

return ++taskCount;

/*

if(formatStr){

return (new Date()).format(formatStr);

}else{

return (new Date()).valueOf();

}*/

}

this.processURL = function(url,timestamp){// 对于请求地址进行处理,并添加任务调度key

if(!url){

return;

}

var single = "&";

if(url.indexOf("?") == -1){

single = "?";

}

return encodeURIComponent(url) + single + self.taskKey + "=" + timestamp;

}

this.getData = function(url,callBack){// 调用websocket获取数据

var callKey = self.currTime();

var requestUrl = self.processURL(url,callKey);

console.log(url);

//if(callBack){// 有回调函数,将函数放入到调度队列中

var paramters = {timestamp:callKey,url:requestUrl,callBack:callBack};

self.taskQueue[callKey] = {timestamp:callKey,url:requestUrl,callBack:callBack};

//}

switch(self.status){

case -1:// 没有建立连接

self.init();

self.waitQueue.push(paramters);

break;

case 0:// 正在建立连接

self.waitQueue.push(paramters);

break;

case 1:// 连接已经建立

self.taskQueue[callKey] = paramters;

self.bizSocket.send(requestUrl);

break;

case 2:// 正在关闭连接

self.waitQueue.push(paramters);

break;

case 3:// 已经关闭连接

self.waitQueue.push(paramters);

break;

}

}

this.init();// 初始化websocket

}

var _ = new socket();// 创建websocket连接对象

服务器返回的数据格式为:

var taskKey = 5;var resultData= [{a:2,b:3},{a:8,b:9}];

希望以上的内容对你使用和学习CshBBrain,CshBBrainAIO,CshBBrainJS有所帮助。

转载于:https://my.oschina.net/cshbbrain/blog/93795

基于开源WebSocket服务器宝贝鱼(CshBBrain)的应用横空出世相关推荐

  1. python aiompq集群_国内首款基于AIO(异步IO)支持集群的高性能开源WebSocket服务器 宝贝鱼 CshBBrain V4.0 发布...

    国内首款基于AIO的开源WebSocket服务器 宝贝鱼 (CshBBrainAIO)正式发布.基于AIO的开源WebSocket服务器 宝贝鱼 依然采用分层的体系结构,协议层和业务层 与 基于NIO ...

  2. 项目宝提供的服务器,开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布

    开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布 更新的功能列表如下: 1.解决开启广播消息开关时,不能同时接入2个客户端的重大缺陷. 2.对广播消息做了重 ...

  3. 宝贝鱼(CshBBrain)集群配置使用说明

    2019独角兽企业重金招聘Python工程师标准>>> 最近有不少朋友在询问宝贝鱼(CshBBrain)集群的问题,说集群老不成功,本篇文章主要就是解答这个问题的. 首先介绍下宝贝鱼 ...

  4. 基于NIO 的轻量级高性能的websocket服务器

    [案例] 由于遇到一个实时采集股指,并把股指的实时数据在手机,平板电脑(股指数据采用的html展示)上展示给读者: 研究了使用ajax轮询请求数据,发现给服务器构成的压力比较大, 于是决定想想其他的方 ...

  5. 基于Boost::beast模块的异步WebSocket服务器

    Boost:基于Boost::beast模块的异步WebSocket服务器 实现功能 C++实现代码 实现功能 基于Boost::beast模块的异步WebSocket服务器 C++实现代码 #inc ...

  6. 基于Boost::beast模块的协程WebSocket 服务器

    Boost:基于Boost::beast模块的协程WebSocket 服务器 实现功能 C++实现代码 实现功能 基于Boost::beast模块的协程WebSocket 服务器 C++实现代码 #i ...

  7. 基于Boost::beast模块的快速WebSocket服务器

    Boost:基于Boost::beast模块的快速WebSocket服务器 实现功能 C++实现代码 实现功能 基于Boost::beast模块的快速WebSocket服务器 C++实现代码 #inc ...

  8. 基于Boost::beast模块的无栈协程WebSocket服务器

    Boost:基于Boost::beast模块的无栈协程WebSocket服务器 实现功能 C++实现代码 实现功能 基于Boost::beast模块的无栈协程WebSocket服务器 C++实现代码 ...

  9. 基于Boost::beast模块的同步WebSocket服务器

    Boost:基于Boost::beast模块的同步WebSocket服务器 实现功能 C++实现代码 实现功能 基于Boost::beast模块的同步WebSocket服务器 C++实现代码 #inc ...

最新文章

  1. 如何构建优质的推荐系统服务?| 技术头条
  2. Arduino的光敏传感器和超声波测距传感器测试代码
  3. 洛谷P1434 [SHOI2002]滑雪
  4. Python第四章__装饰器、迭代器
  5. python爬新闻并保存csv_用python爬取内容怎么存入 csv 文件中
  6. gson 入门_Google GSON入门
  7. 嵌入式Linux入门4:版本控制git的使用
  8. linux 通过虚拟ip出路由器,linux模拟路由器实验
  9. 年夜饭之 -- 洋葱炒墨鱼仔
  10. JavaScript:Web APIsDOMBOM
  11. Django-----模板嵌套
  12. 15.导入网表及status介绍[原创]
  13. Redis 和 memcached 区别(二)
  14. 燃料电池电池超级电容复合能量管理策略simulink仿真模型
  15. win7开机后桌面变成黑色,此window副本不是正版
  16. 利用Rustlings对Rust语言进行学习
  17. 品牌笔记本电脑启动BIOS按键
  18. Linux 环境下metis与parmetis安装与使用
  19. 简历html步骤,HTML 和 CSS 排版简历
  20. c语言结构体嵌套及输出,C语言结构体嵌套

热门文章

  1. android系统手机能看到照片,安卓怎么恢复手机照片?原来可以这样做
  2. cf-tool 简易使用教程
  3. Linux进程调度 - CFS调度器 LoyenWang
  4. 长处比短板更容易困住你,读《能力陷阱》有感
  5. Idea中Translation翻译插件失败问题解决
  6. 开源mysql数据库审计工具_Yearning基于Inception的开源SQL审核平台(数据库审计)
  7. 关于SQL注入靶场搭建及过关教程
  8. QtVtk-009-Cone4
  9. 打造前端 Deepin Linux 工作环境——安装配置 atom 编辑器
  10. Mac版本Redis可视化工具-Redis-Desktop-Manager