协议
- TBinaryProtocol —— 二进制编码格式进行数据传输
- TCompactProtocol —— 高效率的、密集的二进制编码格式进行数据传输
- TJSONProtocol —— 使用 JSON 的数据编码协议进行数据传输
- TSimpleJSONProtocol —— 只提供 JSON 只写的协议,适用于通过脚本语言解析
传输层
创建服务端连接的Socket
设置服务端的socket:
- TServerSocket :使用阻塞式 I/O 进行传输,是最常见的模式
- TNonblockingServerSocket:非阻塞型传输,参考NIO,强烈推荐
传输方式:
TFramedTransport —— 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO
TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端
客户端的连接的Socket
将socket包装传输方式:
服务端类型
- TSimpleServer —— 单线程服务器端使用标准的阻塞式 I/O
- TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O
- THsHaServer 半同步半异步非阻塞单线程服务端,serverTransport必须为TNonblockingServerTransport类型,客户端传输对象必须为TFramedTransport,协议服务端和客户端必须保持一致
- TThreadedSelectorServer半同步半异步非阻塞多线程服务端,强烈推荐,serverTransport必须为TNonblockingServerTransport类型,客户端传输对象必须为TFramedTransport,协议服务端和客户端必须保持一致。
/**
* 创建服务端
* @param serverTransport
* @param processor
* @param singleThread
* @param isBlock
* @return
*/
public TServer createTServer(TServerTransport serverTransport,Processor processor,boolean singleThread,boolean isBlock ) {
if (isBlock) {
if(singleThread) {
// 同步阻塞单线程服务端,性能很差,一般做测试用,禁止在正式环境中使用,协议服务端和客户端必须保持一致。
return new TSimpleServer(new TSimpleServer
.Args(serverTransport)
.processor(processor)
.transportFactory(new TFramedTransport.Factory())
.protocolFactory(new TCompactProtocol.Factory()));
}
// 同步阻塞多线程服务端,客户端如果连接一直不释放,服务端会一直有个线程与之对应,仅适合客户端极少或是没有常连接的情况,协议服务端和客户端必须保持一致。
return new TThreadPoolServer(new TThreadPoolServer
.Args(serverTransport)
.processor(processor)
.transportFactory(new TFramedTransport.Factory())
.protocolFactory(new TCompactProtocol.Factory()));
}
if(singleThread) {
// 半同步半异步非阻塞单线程服务端,serverTransport必须为TNonblockingServerTransport类型,客户端传输对象必须为TFramedTransport,协议服务端和客户端必须保持一致
return new THsHaServer(new THsHaServer
.Args((TNonblockingServerTransport)serverTransport)
.processor(processor)
.transportFactory(new TFramedTransport.Factory())
.protocolFactory(new TCompactProtocol.Factory()));
}
// 半同步半异步非阻塞多线程服务端,强烈推荐,serverTransport必须为TNonblockingServerTransport类型,客户端传输对象必须为TFramedTransport,协议服务端和客户端必须保持一致。
return new TThreadedSelectorServer(new TThreadedSelectorServer
.Args((TNonblockingServerTransport)serverTransport)
.processor(processor)
.transportFactory(new TFramedTransport.Factory())
.protocolFactory(new TCompactProtocol.Factory()));
}
}
客户端异步非阻塞方式
resultHandler
继承接口AsyncMethodCallback ,复写方法:
/**
*
* 异步的客户端的调用
*
*/
public class MyCallback implements AsyncMethodCallback{
//返回结果
Object response = null;
public Object getResult() {
// 返回结果值
return this.response;
}
@Override
public void onComplete(Object response) {
this.response=response;
}
@Override
public void onError(Exception exception) {
}
}
TAsyncClientManager 构建异步客户端:
public class Client {
public static void main(String[] args) throws IOException, TException {
TAsyncClientManager clientManager=new TAsyncClientManager();
TNonblockingSocket transport=new TNonblockingSocket("localhost",80);
TProtocolFactory protocolFactory = new TCompactProtocol.Factory();
HelloWordService.AsyncClient sAsyncClient=new HelloWordService.AsyncClient(protocolFactory, clientManager, transport);
MyCallback callback=new MyCallback();
sAsyncClient.doAction(createRequest("小明",17),callback );
Object result = callback.getResult();
while (result == null) {
result = callback.getResult();
}
}