【发布时间】:2012-02-21 08:26:23
【问题描述】:
我大部分时间都在使用 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);
}
因为处理程序不知道谁在寻找答案,也不知道是谁提出了问题。如果它是在处理程序中完成的,那么如何?
回到我关于示例的 cmets,http 客户端(和处理程序)示例只是将结果转储到 System.out。如果您有一个 GUI,您将如何将请求的结果传递给 GUI?我从来没有见过任何例子。
【问题讨论】:
标签: java networking client-server netty