Thfirt的协议、传输方式、服务端类几个类分析

协议

在这里插入图片描述

  • 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(); 
         } 
		 
		 
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值