yanf4j引入了客户端非阻塞api -欧洲杯足彩官网

`

yanf4j引入了客户端非阻塞api

    博客分类:
  • java

发布一个 版本,这个版本最重要的改进就是引入了客户端连接非阻塞ap i,主要最近的工作要用到,所以添加了。两个核心类tcpconnectorcontrollerudpconnectorcontroller 分别用于tcp和udp的客户端连接控制。例如,现在的udp echo client可以写成:

     // 客户端echo handler
     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的实现:

// 客户端的echo handler
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()方法来判断,因此通常你可能会这样使用:

try  {
            connector.connect(
new  inetsocketaddress( " localhost " 8080 ));
            
while ( ! connector.isconnected())
                ;
        } 
catch  (exception e) {
            e.printstacktrace();
        }


    来强制确保后面对connector的使用是已经连接上的connector,然而更好的做法是在handler的onconnected()回调方法中处理逻辑,因为这个方法仅仅在连接建立后才会被调用。
    两个connectorcontroller都有系列send方法,用于发送数据:

tcpconnectorcontroller.send(object msg)  throws  interruptedexception
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  setsessionwritequeuehighwatermark( int  highwatermark);

     
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。

分享到:
评论

相关推荐

    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...

    免费分享。

    全球最高品质的音乐播放器 各种不解释 懂的下:)

    python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    stm32单片机fpga毕设电路原理论文报告基于ide硬盘的数字图像存储技术研究本资源系百度网盘分享地址

    适合rust入门。深入浅出,事无巨细,远胜市面上所有入门书。而且是免费的

    vb语言vb房屋租凭管理系统毕业设计(源代码 系统)本资源系百度网盘分享地址

    这个示例代码,我们实现了一个用 c 语言判断一个数是否为素数的函数,并通过 main() 函数来测试这个函数。整个过程简单明了,代码结构清晰,易于理解和修改。这个示例展示了 c 语言中函数的定义和调用,以及条件判断和循环等基本语法的使用。

    层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例层次化网络设计案例

    1、嵌入式物联网单片机项目开发实战,每个例程都经过实战检验,简单好用。 2、代码同系列芯片理论是通用的。其他单片机型号请自行更改。 3、软件下载时,请注意下载方式以及对应的下载工具。 4、技术v:wulianjishu666; 5、如果接入其他传感器,请查看发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。

    四脚板凳u型焊接端子冲压成形机sw18可编辑_零件图_机械工程图_机械三维3d建模图打包下载.zip

    python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    vb语言vb毕业生管理系统设计(论文 源代码)本资源系百度网盘分享地址

    python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    安装 swoole-loader 扩展 1、确定 php 版本,线程安全和非线程安全,可在终端(需要登录到服务器,宝塔面板可直接在菜单——终端)中输入 php -v 2、查找扩展路径:php -i | grep extension_dir 3、配置 php.ini,在 php.ini 的最后一行添加:extension=swoole_loader74.so 4、重启php

    stm32单片机fpga毕设电路原理论文报告基于mcs51单片机的专用信号源设计本资源系百度网盘分享地址

    python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    vb语言vb超市进销存管理系统设计(源代码 可执行文件 论文 开题报稿 外文翻译 答辩ppt)本资源系百度网盘分享地址

global site tag (gtag.js) - google analytics
网站地图