Menu

CshBBrain / Blog: Recent posts

开源Websocket服务器CshBBrain股指推送应用使用说明

1.从github 或google code 下载CshBBrain 的1.0.2版本源代码包。下载地址:
GitHub下载地址:https://github.com/CshBBrain/CshBBrain/downloads

googlecode下载地址:http://code.google.com/p/cshbbrain/downloads/list

2.将源代码包解压导入到eclipse中,编译通过。

3.找到src/com/jason/server/ws/ 目录下的 StockServer.java 文件,点击运行。

4.找到test/stock目录下的index.html文件,使用chrome浏览器打开此文件。

5.看到服务器后台有如下输出:

17:16:51,000 INFO MasterServer:192 - [{"raw":"1","name":"上证指数","points":"2104.932","change":"2.06","changeScale":"0.10%"},{"raw":"2","name":"深证成指","points":"8650.191","change":"-14.90","changeScale":"-0.17%"},{"raw":"2","name":"纳斯达克","points":"3044.12","change":"-5.30","changeScale":"-0.17%"},{"raw":"2","name":"日经指数","points":"8534.12","change":"-12.66","changeScale":"-0.15%"},{"raw":"1","name":"道琼斯","points":"13328.85","change":"2.46","changeScale":"0.02%"},{"raw":"1","name":"新加坡海峡时报指数","points":"3041.75","change":"9.09","changeScale":"0.30%"},{"raw":"2","name":"台湾台北指数","points":"7437.04","change":"-14.68","changeScale":"-0.20%"},{"raw":"1","name":"恒生指数","points":"21136.43","change":"137.38","changeScale":"0.65%"}]... read more

Posted by CshBBrain 2012-10-19

开源WebSocket服务器项目CshBBrain中NIO Buffer的使用策略

NIO Buffer带给我们的好处是在进行I/O数据读写时可以用块模式进行了,这相比以往使用字节的模式效率提升不小。首先我们来看下NIO 给我们提供了什么样的Buffer,他们都有些啥子特点,我们在应用应该怎样使用他们以扬长避短达到最佳的效率。
NIO提供了2种类型的Buffer,Direct Buffer 和 Heap Buffer。 Direct Buffer是创建在非java heap上的系统级缓冲区,创建和销毁的开销大;但与I/O数据交换非常快,可以直接与I/O进数据交换。Heap Buffer创建于java heap 上,相当于一个byte[]的封装,创建和销毁开销小。但不能直接与I/O进行数据交换,必须通过一个临时的Direct Buffer来中转数据,所以与I/O的数据交换速度慢。

个人比较认同以下3点意见:

1、 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高;
2、 区别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象,操作系统才会释放Direct Buffer所申请的空间),它似乎给人感觉是“内核缓冲区(buffer in kernel)”。Heap Buffer则是分配在堆上的,或者我们可以简单理解为Heap Buffer就是byte[]数组的一种封装形式,查看JAVA源代码实现,Heap Buffer也的确是这样。
3、 优势:当我们把一个Direct Buffer写入Channel的时候,就好比是“内核缓冲区”的内容直接写入了Channel,这样显然快了,减少了数据拷贝(因为我们平时的read/write都是需要在I/O设备与应用程序空间之间的“内核缓冲区”中转一下的)。而当我们把一个Heap Buffer写入Channel的时候,实际上底层实现会先构建一个临时的Direct Buffer,然后把Heap Buffer的内容复制到这个临时的Direct Buffer上,再把这个Direct Buffer写出去。当然,如果我们多次调用write方法,把一个Heap Buffer写入Channel,底层实现可以重复使用临时的Direct Buffer,这样不至于因为频繁地创建和销毁Direct Buffer影响性能。... read more

Posted by CshBBrain 2012-10-19

开源WebSocket服务器项目CshBBrain客户端超时检查机制剖析

WebSocket要求服务器与客户端之间要保持连接状态,当然当客户端或服务器端关闭了连接对方是有办法检测到的,这个无需我们关心;可以通过发送心跳保持2者之间连接的有效性。从另外一个方面来看,如果是客户端和服务器之间有交互的应用,客户端长时间没有发送业务数据到服务器则说明用户可能在短时间内不会再使用客户端了,这时服务器端可以将这些闲置的连接关闭以达到减少资源的开销。
为了达到这个目的,首先我们需要知道的是客户端是否已经闲置超过了指定的时限,那我们怎样知道呢。最初考虑的方案是这样的,每次客户端发送业务数据到服务器端时,我们就调用System.currentTimeMillis 函数获取到当前系统的毫秒数并在连接对应的Client对象中记录下这个数量preReceiveTimestamp。在系统中创建一个线程遍历每个客户端连接,取出preReceiveTimestamp 和系统当前的毫秒数System.currentTimeMillis 进行比较,如果 System.currentTimeMillis - preReceiveTimestamp 之差超过了设置的超时限制 则说明客户端已经闲置超时 可以关闭了。
但是System.currentTimeMillis 函数的调用需要从 应用线程 切换 到系统内核线程 然后再切换到应用线程中,他们之间的切换如果太过频繁对系统的性能还是有一定的影响。有人测试过在一般的PC服务器上1000w次System.currentTimeMillis调用大概需要12秒左右,平均每次1.3毫秒。这对于大并发量的服务器来说性能上的影响不得不考虑。
为了避免频繁的调用System.currentTimeMillis,而又要达到检查客户端闲置是否超过时限,在开源WebSocket服务器CshBBrain中进行了优化。优化后的方案为当客户端有发送数据到服务器端时,将连接对应的Client对象中的数据接收标识设置为true;在系统中创建一个线程,线程遍历每个客户端连接,检测客户端Client对象中的数据接收标识是否为true,如果不为true则说明客户端闲置超时可以关闭了,如果数据接收标识为true则说明客户端没有闲置超时,并将客户端Client对象中的数据接收标识设置为false,线程没隔系统设置的超时时限对客户端进行是否闲置超时检查一次。这样就避免了频繁的调用System.currentTimeMillis函数,将影响降低到最低。... read more

Posted by CshBBrain 2012-10-19

CshBBrain架构介绍

在介绍CshBBrain服务器架构前,我们先分析下业界流行NIO框架的架构,目前业界流行的NIO框架有Mina,Netty,Grizzly等。他们都采用了Reactor模式,下面上张Reactor模式的示意图:

1.核心组件包括:
1.1.Synchronous Event Demultiplexexer:Event loop + 事件分离
1.2.Dispatcher:事件派发,可以采用多线程实现
1.3.Rqeust Handler:事件处理,业务代码

2.Reactor线程配置:
2.1 Boss Thread + Worker Thread:
2.1.1.Boss 处理OP_ACCEPT、OP_CONNECT,处理连接的接入
2.1.2.Worker处理OP_READ、OP_WRITER,处理IO读写

2.2 Reactor线程数量配置:
Netty: 1 + 2 * CPU内核数量
Mina: 1 + CPU 内核数量 + 1
Grizzly: 1 + 1
CshBBrain:1 + n * CPU内核数量 (运行时可根据需要自己灵活配置,n:为网络数据读写监听线程CPU内核因子,例如设置为1则表示系统将为每个内核创建1个数据读写监听线程,你可以根据自己服务器的性能和需要配置2,4,8个读写监听线程每内核;设置将更加灵活,对应到系统参数monitorWorker)... read more

Posted by CshBBrain 2012-10-19

WebSocket科普

WebSocket为何物?如果你现在还不太清楚请先到baidu百科一下。如果你实在懒得起搜索的话,下面帮你从网络上搜罗了些许有关WebSocket的信息。
Baidu百科:http://baike.baidu.com/view/3623887.htm (下面摘录了些许内容,内容来自Baidu)
WebSocket 规范的目标是在浏览器中实现和服务器端双向通信.双向通信可以拓展浏览器上的应用类型,例如实时的数据推送(股票行情),游戏,聊天/im 等.
背景:目前在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。
原理:websocket规范由两部分组成,一部分是浏览器中的 websocket api, 由w3c 制订, 一部分是websocket 协议, 由ietf制订,目前是draft状态.websocket的协议比较简单, 客户端和普通的浏览器一样通过80或者443端口和服务器进行请求握手,服务器根据http header识别是否一个websocket请求,如果是,则将请求升级为一个websocket连接,握手成功后就进入双向长连接的数据传输阶段. websocket的数据传输是基于帧的方式: 0x00 表示数据开始, 0xff表示数据结束,数据以utf-8编码.... read more

Posted by CshBBrain 2012-10-19
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.