java - 如何使用netty打开连接,并立即将数据发送到我连接的主机?

标签 java netty

我正在尝试弄清楚如何打开与 netty 的连接并向服务器发送一些数据。

这是我正在尝试运行的代码:

public static void main(String[] args) {
    EventLoopGroup workerGroup = new NioEventLoopGroup();

    try {
        Bootstrap b = new Bootstrap(); // (1)
        b.group(workerGroup); // (2)
        b.channel(NioSocketChannel.class); // (3)
        b.option(ChannelOption.SO_KEEPALIVE, true); // (4)
        b.handler(new ChannelInitializer<SocketChannel>() {
            @Override
            public void initChannel(SocketChannel ch) throws Exception {
                ch.pipeline().addLast(new InboundHandler());
                ch.pipeline().addLast(new OutboundHandler());
            }
        });


        Channel channel = b.connect("localhost", 22000).channel();
        channel.write(true); //Lets send a boolean to test. 

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        workerGroup.shutdownGracefully();
    }
}

当我的入站处理程序注册时,我也尝试发送数据。不确定我做错了什么。

最佳答案

将日志记录处理程序添加到管道中以调试数据交换:

@Override
public void initChannel(SocketChannel ch) throws Exception {
    ch.pipeline().addFirst(new LoggingHandler(LogLevel.INFO));
    ch.pipeline().addLast(new InboundHandler());
    ch.pipeline().addLast(new OutboundHandler());
}

您应该添加监听器以对连接完成事件使用react,如下所示:

ChannelFuture cf = b.connect("localhost", 22000);

cf.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
        if(future.isSuccess()) {
            //Here wrap your data into ByteBuf
            future.channel().writeAndFlush(Unpooled.buffer().writeByte(5));
        } else {
            //Connection failed, add proper error handling !
            future.cause().printStackTrace(System.err);
        }
    }
});

确认已收到数据:

strace -e recvfrom nc -k -l 22000

09:16:18.222252 recvfrom(5, "\x05", 8192, 0, NULL, NULL) = 1
09:16:18.223916 recvfrom(5, "", 8192, 0, NULL, NULL) = 0

关于java - 如何使用netty打开连接,并立即将数据发送到我连接的主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41647568/

相关文章:

java - 如何将convertAndSendToUser()与外部代理(例如Spring4中的RabbitMQ)一起使用?

java - 将 netty 与 jedis 一起使用时出错

java - 执行器无法从自身获取的线程中关闭

android - Android 上的 Proguard 和 Netty

java - 由于缺少主类警报,因此无法在MacOS上安装Eclipse

java - 添加 java8 支持时出现 Android Studio 错误

java - 相当于 <tx :jta-transaction-manager/> for Java EE environments 的注释

java - 在Java中读取little-endian 64位 float

java - 无法使用 netty 发送对象

java - 从 Firebase 存储下载音频