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

Netty 连接池未向服务器发送消息

蒙墨竹
2023-03-14

我有一个简单的netty连接池和一个简单的HTTPendpoint来使用该池向ServerSocket发送TCP消息。相关代码看起来是这样的,客户端(NettyConnectionPoolClientApplication)是:

@SpringBootApplication
@RestController
public class NettyConnectionPoolClientApplication {

  private SimpleChannelPool simpleChannelPool;

  public static void main(String[] args) {
    SpringApplication.run(NettyConnectionPoolClientApplication.class, args);
  }

  @PostConstruct
  public void setup() throws Exception {
    EventLoopGroup group = new NioEventLoopGroup();
    Bootstrap bootstrap = new Bootstrap();

    bootstrap.group(group);
    bootstrap.channel(NioSocketChannel.class);
    bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
    bootstrap.remoteAddress(new InetSocketAddress("localhost", 9000));
    bootstrap.handler(new ChannelInitializer<SocketChannel>() {
      protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline();
        pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        pipeline.addLast(new StringDecoder());
        pipeline.addLast(new StringEncoder());
        pipeline.addLast(new DummyClientHandler());
      }
    });
    simpleChannelPool = new SimpleChannelPool(bootstrap, new DummyChannelPoolHandler());
  }

  @RequestMapping("/test/{msg}")
  public void test(@PathVariable String msg) throws Exception {
    Future<Channel> future = simpleChannelPool.acquire();

    future.addListener((FutureListener<Channel>) f -> {
      if (f.isSuccess()) {
        System.out.println("Connected");
        Channel ch = f.getNow();
        ch.writeAndFlush(msg + System.lineSeparator());

        // Release back to pool
        simpleChannelPool.release(ch);
      } else {
        System.out.println("not successful");
      }
    });
  }
}

和服务器(ServerSocketRunner)

public class ServerSocketRunner {

  public static void main(String[] args) throws Exception {
    ServerSocket serverSocket = new ServerSocket(9000);
    while (true) {
      Socket socket = serverSocket.accept();

      new Thread(() -> {
        System.out.println("New client connected");
        try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));) {

          String inputLine, outputLine;
          out.println("Hello client!");

          do {
            inputLine = in.readLine();
            System.out.println("Received: " + inputLine);
          } while (!"bye".equals(inputLine));

          System.out.println("Closing connection...");
          socket.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }).start();
    }
  }
}

虚拟通道池处理程序和虚拟客户端处理程序只是打印出发生的事件,因此它们不相关。当服务器和客户端启动并且我向测试endpoint发送测试消息时,我可以看到服务器打印“新客户端已连接”,但客户端发送的消息未打印。服务器不会打印客户端发送的任何连续消息。

如果我尝试telnet,一切正常,服务器打印出信息。此外,它可以很好地与常规netty客户端一起工作,具有相同的引导配置,没有连接池(SimpleNettyClientApplication)。

谁能看到我的连接池出了什么问题,我没有想法

网络版:4.1.39 .最终版

这里有所有代码。

更新

遵循诺曼·莫勒的建议。我补充道

ChannelFuture channelFuture = ch
    .writeAndFlush(msg + System.lineSeparator());

channelFuture.addListener(writeFuture -> {
  System.out
      .println("isSuccess(): " + channelFuture.isSuccess() + " : " + channelFuture.cause());
});

这个打印出来了

isSuccess: false : java.lang.UnsupportedOperationException: unsupported message type: String (expected: ByteBuf, FileRegion)

为了修复它,我刚刚将String转换为ByteBuf

ch.writeAndFlush(Unpooled.wrappedBuffer((msg + System.lineSeparator()).getBytes()));

共有1个答案

陆绍辉
2023-03-14

您应该检查writeAndFlush(…)返回ChannelFuture的状态是什么。我怀疑它失败了。

 类似资料:
  • 我有一个Netty客户端和一个Netty服务器,并按照主要教程后,为了有一个EchoClient/服务器,我想让它,使我的客户端发送消息到我的服务器,当他第一次连接到它。 下面是我的的方法,这些方法应该解决这个问题: 但是正如你所看到的,教程使用了一个ByteBuf和一个String似乎不起作用! 下面是我如何在我的方法中显示收到的消息: 但是当为使用并在构造函数中初始化它并发送它时,我的服务器不

  • Netty服务器,Fedora。我只是无法从远程主机连接到服务器,并且通过util没有显示监听套接字。但是我可以在同一台机器上建立运行客户端和服务器的连接。就像这样: 我已尝试仅使用端口、localhost IP、0.0.0.0 IP和网络IP初始化

  • 我正在试用netty,但当我响应时,客户端似乎没有收到我的消息。我使用Java NIO和socketChannel编写了相同的代码,看起来很好。我这样说是因为客户机会记录我发送的任何内容。下面是我的服务器 下面是我的服务器处理程序 } 示例响应: 我正在我的盒子上做一个tcpdump,我看到了我在电线上发送的内容,所以我不确定我做错了什么。而且,几分钟后,这会被记录下来,我不确定我在服务器或服务器

  • 我正在尝试使用Reactor Netty连接到docker容器上运行的消息队列。由于依赖性问题,我以独立的方式执行此操作,而不是使用SpringFlux。 从示例中的反应Netty留档,我看到有一种方法可以连接到服务器并获得响应: 但是当我之后尝试通过System.out.println()显示输出时,什么都不会发生。 我也试图了解如何使用: <代码>通量 但我不确定该怎么办。我在文档中看到了一个

  • 我使用的是Netty 3.9.5,我有一个简单的客户机-服务器设置,我从http://en.wikipedia.org/wiki/Netty_(软件)#Netty\u TCP\u示例。我扩展了这个示例,将Java search plan对象从客户端发送到服务器。在这个网站上跟踪用户的帮助下,我已经能够让这个程序按预期运行。 现在,我想让我的读卡器/服务器程序同时接受多个客户端。我想我会使用下面列出

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!