Сейчас я работаю с Apache Thrift, используя язык Java.
У меня проблема с отслеживанием ip-клиента на сервере при использовании THsHaServer . Когда я использую TThreadPoolServer , я могу получить TSocket клиента в процессоре сервера, но он не работает с неблокирующим сервером, особенно с THsHaServer .
Я думаю TFramedTransport завернутый TSocket , поэтому я не могу получить TSocket .
Как получить IP-клиент на неблокирующем сервере в Thrift?
Это мой код
Комиссионный файл
service AuthenticationService {
bool isAuthenticated(1: string username, 2: string password)
}
Упрощенный - Сервер
public class AuthTrackingHsHaServer {
private AuthenticationServiceHandler handler;
private AuthProcessor processor;
private TNonblockingServerTransport serverTransport;
private TServer server;
public AuthTrackingHsHaServer() {
try {
initProcesser();
initTransport();
initServer();
} catch (TTransportException ex) {
Logger.getLogger(AuthTrackingHsHaServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void initProcesser() {
this.handler = new AuthenticationServiceHandler();
this.processor = new AuthProcessor(handler);
}
private void initTransport() throws TTransportException {
serverTransport = new TNonblockingServerSocket(Config.PORT_AUTHENTICATION_SERVICE);
}
private void initServer() {
THsHaServer.Args args
= new THsHaServer.Args(serverTransport)
.transportFactory(new TFramedTransport.Factory(Integer.MAX_VALUE))
.protocolFactory(new TBinaryProtocol.Factory())
.processor(processor)
.executorService(new ThreadPoolExecutor(3, 10, 5, TimeUnit.DAYS, new LinkedBlockingDeque<>()));
args.maxReadBufferBytes = Long.MAX_VALUE;
server = new THsHaServer(args);
}
public void start() throws TTransportException {
System.out.println("Authentication service server is listening on port " + Config.PORT_AUTHENTICATION_SERVICE + " ...");
server.serve();
}
public static void main(String[] args) {
AuthTrackingHsHaServer server = new AuthTrackingHsHaServer();
try {
server.start();
} catch (TTransportException ex) {
Logger.getLogger(AuthTrackingHsHaServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Упрощенно - AuthProcessor, расширяется от процессора
public class AuthProcessor extends AuthenticationService.Processor {
public AuthProcessor(AuthenticationService.Iface iface) {
super(iface);
}
@Override
public boolean process(TProtocol in, TProtocol out) throws TException {
TTransport t = in.getTransport();
TFramedTransport framedTransport = (TFramedTransport) t;
// TODO: How to get TSocket in TFramedTransport
return super.process(in, out); //To change body of generated methods, choose Tools | Templates.
}
}
Упрощенно - обработчик для процессора
public class AuthenticationServiceHandler implements AuthenticationService.Iface {
@Override
public boolean isAuthenticated(String username, String password) throws TException {
return username.equals("abc") && password.equals("12345");
}
}