Java Netty使用标准套接字获取响应
是否可以将响应从Netty server ServerBootstrap发送到作为客户端的标准Java套接字 我试图等待结果,但没有任何成功 服务器: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();
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());