- 浏览: 889335 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (306)
- c#历程 (8)
- java (51)
- ruby & rails (40)
- web开发 (5)
- 工作流 (4)
- 数据库技术 (7)
- 数据结构与算法 (12)
- 设计模式 (5)
- 涂鸦 (36)
- erlang (8)
- my open-source (1)
- 源码解读 (6)
- [网站分类]1.网站买球买球官网平台官网平台首页原创java技术区(对买球买球官网平台官网平台首页文章的要求: 原创、高质量、经过认真思考并精心写作。blogjava管理团队会对买球买球官网平台官网平台首页的文章进行管理。) (0)
- [网站分类]4.其他技术区 (12)
- [网站分类]3.非技术区 (1)
- [网站分类]2.java新手区 (0)
社区版块
- ( 33)
- ( 1529)
- ( 28)
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
since1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与beanutils
发布一个
版本,这个版本最重要的改进就是引入了客户端连接非阻塞ap
i,主要最近的工作要用到,所以添加了。两个核心类tcpconnectorcontroller
和udpconnectorcontroller
分别用于tcp和udp的客户端连接控制。例如,现在的udp echo client可以写成:
class echoclienthandler extends handleradapter {
public void onreceive(session udpsession, object t) {
datagrampacket datagrampacket = (datagrampacket) t;
system.out.println( " recv: " new string(datagrampacket.getdata()));
}
@override
public void onmessagesent(session session, object t) {
system.out.println( " send: " new string(( byte []) t));
}
}
// 连接代码,并发送udp包
udpconnectorcontroller connector = new udpconnectorcontroller();
connector.setsotimeout( 1000 );
connector.sethandler( new echoclienthandler());
connector.connect( new inetsocketaddress(inetaddress.getbyname(host),
port));
for ( int i = 0 ; i < 10000 ; i ) {
string s = " hello " i;
datagrampacket packet = new datagrampacket(s.getbytes(), s.length());
connector.send(packet);
}
udp不是面向连接的,因此connect方法仅仅是调用了底层datagramchannel.connect方法,用来限制接收和发送的packet的远程端点。
再来看看tcpconnectorcontroller的使用,同样看echo client的实现:
class echohandler extends handleradapter < string > {
@override
public void onconnected(session session) {
try {
// 一连接就发送num个字符串
for ( int i = 0 ; i < num; i )
session.send(generatestring(i));
} catch (exception e) {
}
}
public string generatestring( int len) {
stringbuffer sb = new stringbuffer();
for ( int i = 0 ; i < message_len; i )
sb.append(i);
return sb.tostring();
}
@override
public void onreceive(session session, string t) {
// 打印接收到字符串
if (debug)
system.out.println( " recv: " t);
}
}
// ...连接api,tcpconnectorcontroller示例
configuration configuration = new configuration();
configuration.settcpsessionreadbuffersize( 256 * 1024 ); // 设置读的缓冲区大小
tcpconnectorcontroller connector = new tcpconnectorcontroller(configuration,
new stringcodecfactory());
connector.sethandler( new echohandler());
connector.setcodecfactory( new stringcodecfactory());
try {
connector.connect( new inetsocketaddress( " localhost " , 8080 ));
} catch (ioexceptione) {
e.printstacktrace();
}
注意,connect方法并不阻塞
,而是立即返回,连接是否建立可以通过tcpconnectorcontroller.isconnected()方法来判断,因此通常你可能会这样使用:
connector.connect( new inetsocketaddress( " localhost " , 8080 ));
while ( ! connector.isconnected())
;
} catch (exception e) {
e.printstacktrace();
}
来强制确保后面对connector的使用是已经连接上的connector,然而更好的做法是在handler的onconnected()回调方法中处理逻辑,因为这个方法仅仅在连接建立后才会被调用。
两个connectorcontroller都有系列send方法,用于发送数据:
udpconnectorcontroller.send(datagrampacket packet) throws interruptedexception
udpconnectorcontroller.send(socketaddress targetaddr, object msg) throws interruptedexception
0.50-beta2带来的另一个修改就是session接口添加setreadbufferbyteorder
方法,用于设置session接收缓冲区的字节序,默认是网络字节序,也就是大端法。这个方法建议在handler的onsessionstarted回调方法中调用。
在0.50-beta最重要的修改是引入了session发送队列缓冲区的流量控制选项
。默认情况下,session的发送缓冲队列是无界的,队列的push和pop也全然不会阻塞。在设置了缓冲队列的高低水位选项后即引入了发送流量控制,规则如下:
a)当发送队列中的数据总量大于高水位标记(highwatermark),session.send将阻塞
b)在条件a的作用下,session.send的阻塞将持续到发送队列中的数据总量小于于低水位标记(lowwatermark)才解除。
缓冲队列高低水位的设置通过controller的下列方法设置:
public void setsessionwritequeuelowwatermark( int lowwatermark);
缓冲队列的流量控制想法来自ace的ace_message_queue,是通过com.google.code.yanf4j.util.messagequeue类实现的。
0.50-beta还引入了session.send(object msg)的重载版本 session.send(object msg,long timeout),在超过timeout时间后send仍然阻塞时即终止send。注意,现在session.send的这两个方法都返回一个bool值来表示send成功与否,并且都将响应中断(仅限启动了流量控制选项)抛出interruptedexception。
- 2009-02-19 00:15
- 浏览 2570
- 评论(0)
评论
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 7970一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached vs spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4316翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
xmemcached发布1.0-beta版
2009-03-09 15:32 3566xmemcached 发布1.0-beta ,从0.6 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 3726俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 68691、xmemcached是什么? xmemcached是基于 ...
相关推荐
it's nio based (using my opensource nio framework :yanf4j), and was carefully tuned to get top performance. homepage: http://code.google.com/p/xmemcached/ downloads; ...
yanf打开一个配置文件,对其进行读取,从其上的站点中获取新闻,然后将其放在类似于slashdot的网页中。 它支持slashdot,freshmeat。 32bitsonline,segfault,packetstorm,linuxtelephony,linuxtoday,ufie,rdf...
ac3.ico,cda.ico,wav.ico,ape.ico,mp2.ico,m4a.ico,mpc.ico,foobar2000 shell associations updater.exe,lyrics,朴树 - 送别.lrc,李雅微 - 我们的纪念.lrc,céline dion - the greatest reward.lrc,张惠妹 - 你在...