Java Netty使用标准套接字获取响应

Java Netty使用标准套接字获取响应,java,c,netty,nio,Java,C,Netty,Nio,是否可以将响应从Netty server ServerBootstrap发送到作为客户端的标准Java套接字 我试图等待结果,但没有任何成功 服务器: EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap();

是否可以将响应从Netty server ServerBootstrap发送到作为客户端的标准Java套接字

我试图等待结果,但没有任何成功

服务器:

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
        .option(ChannelOption.SO_BACKLOG, 100)
        .handler(new LoggingHandler(LogLevel.DEBUG))
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new ResponseHandler());
            }
        });

    ChannelFuture channelFuture = serverBootstrap.bind(Configuration.serverPort).sync();
        channelFuture.channel().closeFuture().sync();
}
finally {
    bossGroup.shutdownGracefully();
    workerGroup.shutdownGracefully();
}
客户:

Socket socket = new Socket(this.host, this.port);
socket.setKeepAlive(true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream output = new PrintStream(socket.getOutputStream());
output.write("Test");

int response;
while ((response = in.read()) != -1) {
    System.out.println(response);
}

我想你的问题是你需要在服务器和客户端机器上都使用Netty吗?不,你没有。Netty只是一个抽象,尽管它是标准网络之上的一个非常聪明和复杂的抽象,类似于JDK中包含的网络框架——我想这就是你所说的标准java套接字

让服务器端的channelRead看到任何内容时是否遇到问题

您使用的Netty API版本是3、4还是5?这决定了您使用的读取方法


可能还需要显示ServerBootstrap的代码,包括管道初始值设定项,以便查看问题可能出在哪里。

问题出在处理程序上,当我将其更改为处理程序时,我正在使用ChannelInitializer。一切都很好地开始工作

ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
    .option(ChannelOption.SO_BACKLOG, 100)
    .childOption(ChannelOption.SO_KEEPALIVE, true)
    .handler(new LoggingHandler(LogLevel.DEBUG))
    .childHandler(new ResponseHandler());

我使用的是netty 4.0.23.Final,通过服务器接收数据没有问题,但是通过客户端接收数据没有问题,使用上面的结构我没有得到任何响应。在服务器上,当我尝试在客户端执行context.writeTest时,我可以读取数据、处理数据并发回响应事件。我没有获得任何数据。您确定客户端数据确实到达了您的服务器吗?您创建的PrintStream不是自动刷新的,也不是手动刷新的,这意味着数据不应该离开您的客户端。可以肯定,我的代码有点复杂,我发送的不是测试消息,而是创建的帧,我在服务器上接收它,解析它并返回,事件如果我从服务器向客户机发送消息,如Test或请求中的相同消息,我在客户机中仍然没有响应。也许这与异步响应有关,但我使用的是普通套接字,这可能是个问题吗?只有您的客户机似乎在使用标准sockets对java.net.Socket进行可修复的管理。当然,客户机做什么或者用哪种语言实现并不重要,只要它实现了服务器期望的协议,程序员定义了协议,那么我应该如何向客户机发送响应呢?ctx.writemsg是一个好方法吗?
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
    .option(ChannelOption.SO_BACKLOG, 100)
    .childOption(ChannelOption.SO_KEEPALIVE, true)
    .handler(new LoggingHandler(LogLevel.DEBUG))
    .childHandler(new ResponseHandler());