Tag: netty

在Netty连接关闭后重新连接的最佳方法是什么

简单场景: 较低级别的A类,它扩展了SimpleChannelUpstreamHandler。 这个类是发送消息并收到响应的主力。 顶级B类,系统的其他部分可以使用它来发送和接收消息(可以模拟同步和异步)。 此类创建ClientBootstrap,设置管道工厂,调用bootstrap.connect()并最终获得A类的句柄/引用,用于发送和接收消息。 就像是: ChannelFuture future = bootstrap.connect(); Channel channel = future.awaitUninterruptibly().getChannel(); 处理程序= channel.getPipeline()。get(A.class); 我知道在A类中,我可以覆盖public void channelClosed(ChannelHandlerContext ctx,ChannelStateEvent e); 这样当远程服务器关闭时,我会收到通知。 由于在关闭通道之后,B类中的原始类A引用(上面的处理程序)不再有效,因此我需要用新引用替换它。 理想情况下,我希望类A具有在上面覆盖的channelClosed方法中通知类B的机制,因此可以在类B中再次调用bootstrap.connect。一种方法是在类A中引用引用类B的引用为此,我需要将B类引用传递给PipelineFactory,然后让PipelineFactory将B的引用传递给A. 任何其他更简单的方法来实现同样的事情? 谢谢,

如何解码Java中的http POST数据?

我正在使用Netty,我必须接受并解析http POST请求。 据我所知,Netty没有内置的POST支持,只有GET。 (这是一个处理原始网络操作的相当低级的库。使用servlet容器,它可以完成所有这些开箱即用的操作。) 如果我将POST请求的内容作为字节数组,那么将它解析为参数Map的最快且最无错误的方法是什么? 我自己可以写这个,但是JDK中必须有一些方法可以使这更容易。 而且我敢打赌,还有一些问题需要处理。

Netty 4:高写和低写水印

我正在使用Netty 4.我看到Netty服务器的下列选项:WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK。 官方页面相关文章链接到Norman Maurer的Ne​​tty最佳实践(带video的幻灯片) 。 幻灯片之一看起来像这样: ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024); bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); 并有这个前言: 设置理智的WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK 但它是什么WRITE_BUFFER_HIGH_WATER_MARK和WRITE_BUFFER_LOW_WATER_MARK? 以及如何让他们理智 ? 我没有找到任何明确的信息。 谢谢你的帮助。

每个UDP数据报的Netty不同管道

我们已经有一个已经在TCP / IP中实现的服务器,但我们现在要求协议也支持UDP。 发送的每个UDP数据报都包含我需要解码的所有内容,因此它是一个非常简单的回复和响应系统,数据报中的数据由换行符分隔。 启动服务器时引导程序的代码如下所示: //SETUP UDP SERVER DatagramChannelFactory udpFactory = new NioDatagramChannelFactory(Executors.newCachedThreadPool()); ConnectionlessBootstrap udpBootstrap = new ConnectionlessBootstrap(udpFactory); udpBootstrap.setOption(“sendBufferSize”, 65536); udpBootstrap.setOption(“receiveBufferSize”, 65536); udpBootstrap.setOption(“receiveBufferSizePredictorFactory”, new AdaptiveReceiveBufferSizePredictorFactory()); udpBootstrap.setOption(“broadcast”, “true”); udpBootstrap.setPipelineFactory(new ServerPipeLineFactoryUDP()); udpBootstrap.bind(new InetSocketAddress(hostIp, 4000)); 管道代码是: class ServerPipeLineFactoryUDP implements ChannelPipelineFactory { private final static ExecutionHandler EXECUTION_HANDLER = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(ScorpionFMS.THREAD_POOL_COUNT, 0, 0)); public ServerPipeLineFactoryUDP() { } @Override public […]

在Tomcat中托管Netty Server是否可行/可取?

我们构建基于Netty / NIO的服务,我正在考虑将此服务部署到我们的生产环境中。 我们标准的部署服务的方式是作为WAR,部署在Tomcats中。 当我在这里建议采用相同的方法时,我得到了“不应该做”的呐喊和抱怨,因为Netty和Tomcat都是服务器,“将一台服务器托管在另一台服务器上是没有意义的”。 对我而言,它非常有意义,因为它完全解决了我的部署问题,并使我免于编写其他代码。 为什么这么大“不不”?

使用Netty的异步HTTP客户端

我是netty的新手,仍然喜欢找我的路。 我正在寻找创建一个异步工作的http客户端。 http的netty示例仅显示如何等待IO操作,而不是如何使用addListener ,因此我一直试图在过去几天解决这个问题。 我正在尝试创建一个请求类,它将处理请求的所有不同状态,包括连接,发送数据,处理响应,然后关闭连接。 为了做到这一点,我的类扩展了SimpleChannelUpstreamHandler并实现了ChannelFutureListener 。 我使用ChannelPipelineFactory将类(作为SimpleChannelUpstreamHandler )的(this)实例作为处理程序添加到管道。 连接创建如下: this.state = State.Connecting; this.clientBootstrap.connect(this.address).addListener(this); 然后是operationComplete方法: @Override public void operationComplete(ChannelFuture future) throws Exception { State oldState = this.state; if (!future.isSuccess()) { this.status = Status.Failed; future.getChannel().disconnect().addListener(this); } else if (future.isCancelled()) { this.status = Status.Canceled; future.getChannel().disconnect().addListener(this); } else switch (this.state) { case Connecting: this.state = State.Sending; Channel channel […]

Netty IdleStateHandler的问题 – 我是以错误的方式测试它的吗?

我有一个玩具Netty服务器,我试图在他们的频道上没有发生任何事情时向客户发送心跳消息。 我通过telnet到服务器,写一条消息,然后不发送任何东西来测试这个,但我没有听到任何声音! 安慰: >>telnet localhost 6969 Trying 127.0.0.1… Connected to localhost. Escape character is ‘^]’. >>foo Did you say ‘foo’? MyPipelineFactory.java public class MyPipelineFactory implements ChannelPipelineFactory { private final Timer timer; private static final ChannelHandler stringDecoder = new StringDecoder(); private static final ChannelHandler stringEncoder = new StringEncoder(); private final ChannelHandler idleStateHandler; public MyPipelineFactory(Timer t) { […]

ChannelOption.SO_BACKLOG做什么?

.option(ChannelOption.SO_BACKLOG, 100) 显示在Netty 4升级文档中。 你能解释它的作用吗? 谢谢!

以编程方式关闭netty

我正在使用netty 4.0.24.Final。 我需要以编程方式启动/停止netty服务器。 启动服务器时,线程被阻止 f.channel().closeFuture().sync() 请帮助提供一些提示如何正确执行此操作。 下面是Main类调用的EchoServer。 谢谢。 package nettytests; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; public class EchoServer { private final int PORT = 8007; private EventLoopGroup bossGroup; private EventLoopGroup workerGroup; public void start() throws Exception { // Configure the […]

Netty IllegalReferenceCountException

这是我在这里的回答。 虽然我的业务逻辑没有问题,但事实certificate我没有使用Netty ByteBuf 。 一旦我更新了我的测试代码以使用ByteBuf ,我遇到了一个无限循环的IllegalReferenceCountException 。 我承认自己是Netty的新手,但这并不能certificate回到手动资源分配和发布的时代。 创建GC是为了避免这种混乱。 迪斯科,有人吗? 那么Bell Bottoms怎么样? public class StringDecoder extends AbstractDecoder { private static final IntPredicate NEWLINE_DELIMITER = b -> b == ‘\n’ || b == ‘\r’; @Override public Flux decode(Publisher publisher, ResolvableType elementType, MimeType mimeType, Map hints) { return Flux.from(publisher) .scan(Tuples.<Flux, Optional>of(Flux.empty(), Optional.empty()), (acc, buffer) -> { List […]