我对Netty有了初步的了解,但是还有一个概念一直在困扰我,而且我在教程等资料中找不到任何相关信息。首先我知道Netty是异步的,但是客户端必须有一种方法来调用服务器并能够在处理程序之外获得响应。让我解释更多。
我有一个客户端如下所示。请注意,我知道它被引导并且每次调用都会建立新的连接,这只是为了使示例更小更简洁。请忽略这个事实。
Client.java
// ServerResponse is a result from the server, in this case
// a list of users of the system (ignore that each time it's all bootstrapped).
public User[] callServerForInformationFromGUIWidget()
{
ClientBootstrap bootstrap = new ClientBootstrap(...);
bootstrap.setPipelineFactory(...);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
Channel channel = future.awaitUninterruptibly().getChannel();
// Where request is a POJO sent to the server,
// with a request such as get me a list of users
RequestPojo request = new RequestPojo(requestUserListCommand);
ChannelFuture lastWriteFuture = channel.write(request);
if(lastWriteFuture != null)
lastWriteFuture.awaitUninterruptibly();
}
现在我明白了如何在服务器上获取数据并返回结果。唯一的问题是如何在客户端处理它?是的,clientHandler类可以做类似以下的事情:
ClientHandler.java
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
User[] users = (User[])e.getMessage();
}
问题是客户端代码如何获得结果?所有示例都类似于聊天服务,其中事件触发客户端上的其他内容,而不是等待响应。即使是我找到的http客户端示例也缺乏此功能。总体文档非常好,但缺乏如何执行回调的说明。无论如何,在这种情况下,我需要客户端从服务器获取响应,并根据结果执行必要的操作。换句话说,我该如何编写客户端来执行类似以下的操作:
IdealClient.java
// ServerResponse is a result from the server, in this case
// a list of users of the system.
public User[] callServerForInformationFromGUIWidget()
{
...
RequestPojo request = new RequestPojo(requestUserListCommand);
ChannelFuture lastWriteFuture = channel.write(request);
if(lastWriteFuture != null)
lastWriteFuture.awaitUninterruptibly();
User[] users = resultFromCallToServer();
performSomeAction(users);
}
因为处理程序不知道谁在寻找答案,或者谁提出了问题。而且如果在处理程序中完成,那么该如何实现?
回到我对示例的评论,http客户端(和处理程序)示例只是将结果转储到System.out。如果您有一个GUI,您要如何将请求的结果传递给GUI?我从未见过任何此类示例。