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

如何使用netty客户端编写消息?

荆运诚
2023-03-14

我试图使用Netty构建一个简单的TCP客户端-服务器应用程序。开始时,我通过SocketChannel从客户端发送消息,方式如下:

    SocketChannel client = SocketChannel.open(hostAddress);
    client.write(buffer);

所有的消息都被服务器收到了,但是当我想把响应写回客户端时,我发现为了得到客户端的响应,它需要通过引导程序发送消息,并定义将读取响应的Inoundhandler(也许有人知道另一种方法?)当我试图通过引导程序发送消息时,我使用以下代码:

    EventLoopGroup group = new NioEventLoopGroup();
    Bootstrap b = new Bootstrap();
    b.group(group).channel(NioSocketChannel.class);
    b.handler(new ChannelInitializer<SocketChannel>() {

        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            // TODO Auto-generated method stub
            ch.pipeline().addLast(new TestClientHandler());
        }

      });
    ChannelFuture future = bootstrap.connect(hostAddress);
    future.channel().writeAndFlush(buffer);

但是通过这种方式,服务器根本没有收到消息!这是我用于服务器的代码(当我不通过客户端的引导程序发送消息时,它工作正常):

    bootstrap = new ServerBootstrap();
    bootstrap.group(boosGroup, workerGroup);
    bootstrap.channel(NioServerSocketChannel.class);
    bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
              ChannelPipeline pipeline = ch.pipeline();
              pipeline.addLast(dnsMessageDecodingHandler); 
              pipeline.addLast(group,"DnsTcpHandler",dnsTcpHandler); 
            }
          });
     future = bootstrap.bind(hostAddress).await();

在Netty中编写一个简单的客户端-服务器的正确方法是什么?我没有找到任何可以做到这一点的工作示例……

谢谢,奥斯纳特。

共有3个答案

阎星华
2023-03-14

在我检查了从writeAndFlush返回的ChannelFuture的原因(就像Norman Maurer建议我做的那样)后,我看到原因是:不支持的消息类型:HeapByteBuffer(预期:ByteBuf,FileRegion)这是因为我没有向客户端管道添加ObjectEncoder!!这个添加解决了这个问题:b . handler(new ChannelInitializer(){

        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            // TODO Auto-generated method stub
            ch.pipeline().addLast(new ObjectEncoder());
            ch.pipeline().addLast(new TestClientHandler());
        }

      });

感谢所有帮助过我的人!奥斯纳特。

万嘉熙
2023-03-14

netty存储库中有多个示例,我不确定为什么你说没有。

https://github.com/netty/netty/tree/4.1/example

也就是说,我怀疑问题在于您没有“等待”到< code >连接(...)操作完成。如果您想检查由< code>writeAndFlush(...)它早就告诉你这些了。

S因此,快速修复方法是:

ChannelFuture future = bootstrap.connect(hostAddress).await();
future.channel().writeAndFlush(buffer);
麹凯捷
2023-03-14

你应该知道TCP连接是如何工作的

本文描述了典型的TCP流。https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.14/gtps7/s5tcpcf.html

阅读本文后,您需要正确编写服务器代码

// create your server bootstrap
ServerBootstrap b = new ServerBootstrap();

// add your ChannelInitializer which handles when client has been connected to your server
// in ChannelInitializer you need to register your ChannelHandler, such as ChannelDuplexHandler to client channel pipeline
b.childHandler(YOUR_CHANNEL_INITIALIZER); 

b.bind(bindAddress); // your server will now listen() for client connect()

运行引导代码后,客户端可以连接到服务器

 类似资料:
  • 我将创建一个身份验证服务器,它本身与一组不同的Oauth2.0服务器交互。Netty似乎是在这里实现网络部分的一个很好的候选者。但在开始之前,我需要澄清一些关于netty的细节,因为我是新手。例行程序如下: > < li> 服务器接受来自客户端的HTTPS连接。 然后,不关闭第一个连接,它通过HTTPS与远程OAuth2.0服务器建立另一个连接并获取数据 毕竟,服务器将结果发送回客户端,客户端应该

  • 我正在构建一个tcp客户端来接收和发送消息。我按照Netty用户指南中的步骤编写了一个简单的tcp客户端,其中包含一个扩展的自定义处理程序。 在hander中,我存储了< code > ChannelHandlerContext : 然后我有一个发送方法,它使用发送消息: 我发现的另一个选项是在客户机类中使用

  • 1.场景描述:设备向Netty服务器发送数据(大约##20ms间隔##),Netty服务器向客户端转发消息##立即##(IOS或Android)。2.关联业务代码CTX.WriteAndFlush(msg) 3.发出网络服务器可以及时接收设备数据,网络服务器也可以及时将数据写入套接字缓冲区。但Netty客户端收到消息时延!!!(如5s时延) 4.服务器带宽配置入站100M/bps位/秒。出站5M/

  • 创建 HTTP 客户端 使用默认选项创建一个HttpClient实例,如下所示: HttpClient client = vertx.createHttpClient(); 如果您想要在创建时配置客户端的选项,如下所示: HttpClientOptions options = new HttpClientOptions().setKeepAlive(false); HttpClient clien

  • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s

  • 问题内容: 这实际上是我在这里的第一篇文章,一段时间以来我一直在试图弄清楚这一点,但是我终于打电话给该旗帜,并将尝试寻求有关此主题的一些帮助。 因此,我有一个客户端和一个服务器,它们是根据回显客户端/服务器和安全聊天客户端/服务器建模的。我对聊天的SSL部分和使用回显仅对确保我在客户端/服务器之间收到响应不感兴趣。我将在这篇文章的底部添加所有相关代码。我现在遇到的问题是,在客户端连接后,我可以从服