概述
场景:
- 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初学--服务端构造(阻塞、非阻塞方式两种服务端)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复