场景:
- 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底层的一些构造。看来知识都是相通的。
|