我大部分都是使用Netty,但有一个概念仍然在暗示着我,而我在教程中找不到任何东西等等。首先,我明白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?我从来没有见过这样的例子。
我试图按照你的指引来注册监听器,但我得到一个“不兼容的类型:字符串不能转换为DataChangeEvent”......出了什么问题?谢谢。 – Phobox 2016-03-09 09:10:31