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

    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,张惠妹 - 你在...

global site tag (gtag.js) - google analytics