我是靠谱客的博主 标致面包,最近开发中收集的这篇文章主要介绍Thrift初学--服务端构造(阻塞、非阻塞方式两种服务端),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

场景:
  • thrift-0.9.3版本
1、阻塞模式TThreadPoolServer
     从源码中很容易发现,该代码采用的是JDK中java.net.ServerSocket作为服务端套接字。
因此,很容易辅助理解其为什么为阻塞模式。
  •   服务端的示例代码如下:   
            TServerSocketserverTran= newTServerSocket(18000);//负责服务端套接字的管理
            Hello.Processor<Iface>pro= newProcessor<Iface>(newHelloImpl());
            Factoryfactory= newTBinaryProtocol.Factory(true,true);
            Argsargs= newArgs(serverTran);
            args.processor(pro);
            args.protocolFactory(factory);
            
            TServerserver= newTThreadPoolServer(args);
            server.serve();// 启动Server

  • TServer 源码中启动代码如下:

server.serve();// 其源码如下:

 publicvoid serve() {
   try{
     serverTransport_.listen();//这里调用的是TServerSocket的listen()方法,监听是否存在新的client申请
    }catch(TTransportException ttx) {
     LOGGER.error("Error occurred during listening.",ttx);
     return;
    }
    ...
  }
  • TServerSocket的初始化类如下:

 publicTServerSocket(ServerSocketTransportArgsargs)throws TTransportException {
   clientTimeout_= args.clientTimeout;
   if(args.serverSocket!=null) {
     this.serverSocket_= args .serverSocket;
     return;
    }
   try{
     // Make server socket
     serverSocket_= newServerSocket();//这里引用的是java.net.ServerSocket类,阻塞模式的Socket
     // Prevent 2MSL delay problem on server restarts
     serverSocket_.setReuseAddress(true);
     // Bind to listening port
     serverSocket_.bind(args.bindAddr,args.backlog);
    }catch(IOException ioe) {
      close();
     thrownew TTransportException("Could not create ServerSocket on address "+args.bindAddr.toString() +".",ioe);
    }
  }

2、非阻塞模式TNonblockingServer
  源码写的非常清晰可见。
  • 服务端示例代码如下

            TNonblockingServerTransportserverTran= newTNonblockingServerSocket(19000);//负责构造服务端套接字
            Hello.Processor<Iface>pro= newProcessor<Iface>(newHelloImpl());
            TCompactProtocol.FactoryproFac= newTCompactProtocol.Factory();
            TFramedTransport.FactorytranFac= newTFramedTransport.Factory();
           TNonblockingServer.Argsargs= newTNonblockingServer.Args(serverTran);
            args.processor(pro);
            args.protocolFactory(proFac);
            args.transportFactory(tranFac);
            
           TServerserver = newTNonblockingServer(args);
            server.serve();// 启动server     

  • 源码中服务端套接字的创建源码如下:

 publicTNonblockingServerSocket(NonblockingAbstractServerSocketArgsargs ) throwsTTransportException {
   clientTimeout_= args.clientTimeout;
   try{
     serverSocketChannel= ServerSocketChannel. open();// 熟悉吧!NIO方式的
     serverSocketChannel.configureBlocking(false);// NIO的非阻塞设置

     // Make server socket
     serverSocket_= serverSocketChannel.socket();
     // Prevent 2MSL delay problem on server restarts
     serverSocket_.setReuseAddress(true);
     // Bind to listening port
     serverSocket_.bind(args.bindAddr,args.backlog);
    }catch(IOException ioe) {
     serverSocket_= null;
     thrownew TTransportException("Could not create ServerSocket on address "+args.bindAddr.toString() +".");
    }
  }

  总之,从上面可以看出大家还是围绕JDK的NET、NIO在文章。了解了JDK的基本Socket通信基础,则使用这些的框架就非常容易理解,包括netty底层的一些构造。看来知识都是相通的。

最后

以上就是标致面包为你收集整理的Thrift初学--服务端构造(阻塞、非阻塞方式两种服务端)的全部内容,希望文章能够帮你解决Thrift初学--服务端构造(阻塞、非阻塞方式两种服务端)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部