当前位置: 首页 > 知识库问答 >
问题:

如何在其他类中以网络形式阅读消息

廉学潞
2023-03-14

我想在入站处理程序以外的类中的特定位置读取消息。我无法在 channelRead0 方法中找到读取预期内容的方法,该方法从 netty 框架调用。

例如:

context.writeMessage("message");
String msg = context.readMessage;

如果这是不可能的,我如何将我在channelRead0方法中获得的结果映射到我在另一个类中进行的特定调用?

共有1个答案

董花蜂
2023-03-14

Netty框架被设计成异步驱动的。使用这个类比,它可以以最少的线程使用处理大量连接。如果您正在创建一个使用netty框架将调用分派到远程位置的api,您应该对您的调用使用相同的类比。

不要让你的 API 直接返回值,而是让它返回未来

例如:

这在很大程度上基于我过去提交的答案。

我们从将请求映射到管道中请求的out处理程序开始:

public class MyLastHandler extends SimpleInboundHandler<String> {
    private final SynchronousQueue<Promise<String>> queue;

    public MyLastHandler (SynchronousQueue<Promise<String>> queue) {
        super();
        this.queue = queue;
    }

    // The following is called messageReceived(ChannelHandlerContext, String) in 5.0.
    @Override
    public void channelRead0(ChannelHandlerContext ctx, String msg) {
        this.queue.remove().setSuccss(msg); 
        // Or setFailure(Throwable)
    }
}

然后,我们需要一种将命令发送到远程服务器的方法:

java prettyprint-override">Channel channel = ....;
SynchronousQueue<Promise<String>> queue = ....;

public Future<String> sendCommandAsync(String command) {
    return sendCommandAsync(command, new DefaultPromise<>());
}

public Future<String> sendCommandAsync(String command, Promise<String> promise) {
    synchronized(channel) {
        queue.offer(promise);
        channel.write(command);
    }
    channel.flush();
}

完成方法后,我们需要一种方法来调用它:

sendCommandAsync("USER anonymous", 
    new DefaultPromise<>().addListener(
        (Future<String> f) -> {
            String response = f.get();
            if (response.startWidth("331")) {
                // do something
            }
            // etc
        }
    )
);

如果被调用方希望使用我们的api作为阻塞调用,他也可以这样做:

String response = sendCommandAsync("USER anonymous").get();
if (response.startWidth("331")) {
    // do something
}
// etc

请注意Future。与套接字读取操作不同,如果线程状态中断,get()会抛出一个InterruptedException。FutureListener中不应该出现此异常。

 类似资料:
  • 问题内容: 我想在班级以外的特定位置阅读消息。我找不到在netty框架中调用的方法中读取期望值的方法。 例如: 如果不可能,如何将方法中得到的结果映射到在另一个类中进行的特定调用? 问题答案: Netty框架设计为异步驱动。使用这种类比,它可以以最少的线程使用量处理大量连接。如果您要创建一个使用netty框架将调用分派到远程位置的api,则应该对调用使用相同的类比。 而不是让api直接返回值,而是

  • 问题内容: 我正在开发一个应用程序,当我从列表中选择一个值(文件)时,应该在另一种形式的jTextPane中打开它。我正在使用两个面板,一个是显示我的列表的mainpanel,另一个是ExcelSheet,当我单击列表值时,mainpanel关闭并显示新表单ExcelSheet,但不显示jTextPane中doc文件的内容。 问题答案: 使用封装,为了显示给定文件更新文本窗格中的代码。您可以从添加

  • 我正在创建一个应用程序,在其中我想阅读所有电子邮件并希望在列表视图中显示。我一直在寻找,但找不到任何合适的方法。我试过下面的代码: 但它返回电子邮件地址,如果我想阅读实际的电子邮件怎么办?有什么办法吗?Android API会公开这一点吗?还有一件事,在下面的一个地方我发现了获取电子邮件的方法 但游标返回 null。我相信没有办法从Android设备读取电子邮件。可能是电子邮件被保存在该应用程序(

  • 我有一个很大的问题,我不知道我是否错过了一些明显的东西或什么,但我不能发现我的错误。我有类SPN、A和B。我重载了2次operator=。我想将A类型或B类型作为参数传递。 它不会抛出任何错误。但是如果我在类B或A中尝试make operator(),则使用参数SPN,如下所示: 它会抛出SPN未命名类型的错误。我甚至不能在A类或B类中创建类SPN对象。也许它不是如何客观编程工作,所以我想得到它,

  • 我们目前正在开发云数据流上的概念验证Apache Beam管道。我们将一些文件(没有文本;自定义二进制格式)放入Google Cloud Buckets,并希望将这些文件作为byte[]读取,并在流中反序列化它们。但是,我们找不到能够读取非文本文件的波束源。唯一的想法是扩展类,但我们认为应该有一个更简单的解决方案,因为这听起来是一个非常简单的任务。 谢谢你们的帮助。

  • 有没有一个清晰的方法,可以很容易地实现扫描本地网络,以获得连接到我的WiFi网络的设备的MAC地址在Android中?谢谢。