場景:
- 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底層的一些構造。看來知識都是相通的。 |