使用非阻塞式IO,服务端和客户端需要指定 TFramedTransport 数据传输的方式。
服务端HelloTNonblockingServer.java:
package cn.slimsmart.thrift.demo.helloworld;
import org.apache.thrift.TException;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.TNonblockingServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
/**
* 注册服务端
* 使用非阻塞式IO,服务端和客户端需要指定 TFramedTransport 数据传输的方式。 TNonblockingServer
*/
public class HelloTNonblockingServer {
// 注册端口
public static final int SERVER_PORT = 8080;
public static void main(String[] args) throws TException {
//处理器
TProcessor tprocessor = new HelloWorld.Processor<HelloWorld.Iface>(new HelloWorldImpl());
// 传输通道 - 非阻塞方式
TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT);
//异步IO,需要使用TFramedTransport,它将分块缓存读取。
TNonblockingServer.Args tArgs = new TNonblockingServer.Args(serverTransport);
tArgs.processor(tprocessor);
tArgs.transportFactory(new TFramedTransport.Factory());
//使用高密度二进制协议
tArgs.protocolFactory(new TCompactProtocol.Factory());
// 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式
TServer server = new TNonblockingServer(tArgs);
System.out.println("HelloTNonblockingServer start....");
server.serve(); // 启动服务
}
}
客户端
HelloNonblockingClient.java
:
package cn.slimsmart.thrift.demo.helloworld;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
/**
* 客户端调用HelloTNonblockingServer,HelloTHsHaServer
* 非阻塞
*/
public class HelloNonblockingClient {
public static final String SERVER_IP = "127.0.0.1";
public static final int SERVER_PORT = 8080;
public static final int TIMEOUT = 30000;
public static void main(String[] args) throws TException {
//设置传输通道,对于非阻塞服务,需要使用TFramedTransport,它将数据分块发送
TTransport transport = new TFramedTransport(new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT));
// 协议要和服务端一致
//HelloTNonblockingServer
使用高密度二进制协议
TProtocol protocol = new TCompactProtocol(transport);
//HelloTHsHaServer
使用二进制协议
//TProtocol protocol = new TBinaryProtocol(transport);
HelloWorld.Client client = new HelloWorld.Client(protocol);
transport.open();
String result = client.sayHello("jack");
System.out.println("result : " + result);
//关闭资源
transport.close();
}
}