Tag: netty

netty 4.xx中的UDP广播

我们需要使用Netty 4.0.0二进制文件在UDP通道上广播一个Object(Pojo)。 在Netty 4.0.0中,它允许我们仅使用DatagramPacket类来发送UDP数据包。 该类仅接受ByteBuf作为参数。 还有其他方法,我们可以通过UDP通道发送Pojo吗? 为进一步澄清,我们做了如下: 初始化UDP通道的设置 ConnectionlessBootstrap udpBootstrap; udpBootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline( new ObjectEncoder(), new ObjectDecoder(new NettyElementInfo()), new UDPBroadcastHandler()); } }); udpBootstrap.setOption(“broadcast”, true); //datagramChannel = (DatagramChannel) udpBootstrap.bind(new InetSocketAddress(udp_port)); datagramChannel = (DatagramChannel) udpBootstrap.bind(new InetSocketAddress(0)); 这里,NettyElementInfo实现了Serializable和ClassResolver接口。我们试图按如下方式广播这个pojo: channel.write(new NettyElementInfo(), new InetSocketAddress(“255.255.255.255”, 9555)); 在接收端,我们对上面的初始化部分做了同样的事情。但是,在处理程序中获取Pojo如下: NettyElementInfo elementInfo = (NettyElementInfo)e.getMessage(); 这是使用netty 3.5.x成功完成的 […]

在处理程序中组装一个Netty消息

我正在为我的项目制作Netty原型。 我试图在Netty上实现一个简单的面向文本/字符串的协议。 在我的管道中,我使用以下内容: public class TextProtocolPipelineFactory implements ChannelPipelineFactory { @Override public ChannelPipeline getPipeline() throws Exception { // Create a default pipeline implementation. ChannelPipeline pipeline = pipeline(); // Add the text line codec combination first, pipeline.addLast(“framer”, new DelimiterBasedFrameDecoder(2000000, Delimiters.lineDelimiter())); pipeline.addLast(“decoder”, new StringDecoder()); pipeline.addLast(“encoder”, new StringEncoder()); // and then business logic. pipeline.addLast(“handler”, new TextProtocolHandler()); return pipeline; } […]

当我必须在Netty4编码器中调用ByteBuf.retain()时?

我正在编写一个NUL-终止JSON消息的编码器,以便在消息碎片化时对其进行解码。 我找到了这个样本 – > 点击最后调用ByteBuf.retain()地方,将现有的ByteBuf写入输出。 他们为什么这样做,为什么需要呢? 这是我的编码器: public class FrameEncoder extends MessageToMessageEncoder { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { out.add(msg.retain()); out.add(ctx.alloc().buffer(1).writeByte(NUL)); } }

如何关闭Netty库调试输出?

我正在使用Netty(通过Ning异步HTTP 库 )通过HTTP检索文档。 这会在控制台上产生大量的调试输出,如下面列出的单个文档请求。 任何人都知道如何关闭它? 我真的不需要看到这个输出。 我打电话给Scala,如果这有任何区别的话。 15:07:14.273 [run-main] DEBUG cnhcpnNettyAsyncHttpProvider – Non cached request DefaultHttpRequest(chunked: false) GET /api/search.json?q=foo HTTP/1.1 Host: www.documentcloud.org Connection: keep-alive Accept: */* User-Agent: NING/1.0 using Channel [id: 0x2839ca40] 15:07:14.930 [New I/O client worker #1-1] DEBUG cnhcpnNettyAsyncHttpProvider – Request DefaultHttpRequest(chunked: false) GET /api/search.json?q=foo HTTP/1.1 Host: www.documentcloud.org Connection: keep-alive Accept: */* User-Agent: NING/1.0 […]

TCP Netty确保收到消息

我正在创建客户端 – 服务器系统,应该能够在不稳定的网络中工作。 它假设连接可以一次断开,然后系统必须重新连接并继续它的工作。 我正在使用Netty并遇到一个问题:我们怎么知道我们发送的消息是由另一台主机收到的? 我在想,为此可以使用ChannelFuture,如果附加的未来监听器失败,我可以简单地尝试再次发送消息: ChannelFuture fut = channel.write(message); fut.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (!future.isSuccess()) { LOGGER.error(“Message send failed. Message: ” + message, future.getCause()); //Queue message to be send after reconnect } } }); 但是当我完成时,我注意到,听众从不打印错误。 (当我的系统几乎无法正常工作时,我通过从网络上拔下来测试了这一点)我还注意到,我发送的消息的所有未来都进入“完成”状态,并且无法确保收到消息(不使用确认消息) 据我所知,TCP协议保证会收到消息,使用它时我们可以知道哪些发送包到达目的地,哪些不到。 我无法相信Netty不允许知道它。 有没有一种好方法可以知道消息已经发送?

C#相当于Java的DataOutputStream?

我已经对这个主题做了很多研究,我发现这个问题经常被问到,但是没有一个人能得到我正在寻找的答案,最常见的解决方案是使用随附的BinaryWriter类C#,但它似乎没有做它的工作。 对于我的服务器应用程序,我使用Netty作为基于Java的NIO网络库,它使用DataInput和DataOutput Streams。 我有一个在java中工作的客户端,但它仅用于测试目的,我现在正在将其转移到C#以将其放入我的游戏中。 这是基本格式的C#代码,只是试图让事情暂时起作用。 Client = new TcpClient (); try { Client.Connect (IPAddress.Parse (“127.0.0.1”), PORT); Stream = Client.GetStream(); ClientOutput = new BinaryWriter(Stream); ClientInput = new BinaryReader(Stream); ClientOutput.Write ((string) “UserIsBob”); ClientOutput.Write ((string) “MyPassLol”); ClientOutput.Flush(); } 现在,这看起来很好; 但这是问题,在使用时 DataInputStream.readUTF() 在Java服务器上,没有任何反应; 但是,如果我使用 DataOutputStream.writeUTF(String) 从Java客户端,服务器将完美地读取它并将其打印到控制台。 我真的不确定我做错了什么,但似乎没有太多关于它的信息。 我需要的function如下: WriteByte(字节) WriteBytes(字节[]) WriteUTF(字符串) WriteInt(INT) WriteLong(长) WriteFloat(浮点) WriteDouble(双) WriteBoolean(布尔) 根据我的理解,你可以通过类型转换在BinaryWriter类中完成所有这些操作, 但它似乎没有被Java DataInputStream拾取 […]

如何正确使用ChunkedStream

这是我的用例…我有一个上游服务,通过网络发送我的Netty应用程序数据,并且该数据需要发布到连接到Netty的多个客户端。 推送到客户端的数据必须是HTTP“Transfer-Encoding:chunked”。 我找到了ChunkedStream ,虽然也许我可以创建一个PipedInputStream和一个PipedOutputStream (连接到PipedInputStream )并将ChunkedStream写入通道。 然后,当从我的上游服务收到数据时,我可以将数据写入通道的PipedOutputStream ,然后将其发送给客户端: 在channelConnected中 PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(in); ctx.getChannel().write( new PersistentChunkedStream(in) ); 单独的线程将数据发布到连接的通道 ChannelBuffer buff = ChannelBuffers.copiedBuffer(“FOO”,CharsetUtil.UTF_8); out.write( buff.array() ); channel.get(ChunkedWriteHandler.class).resumeTransfer(); 如果有0个字节可用,我必须扩展ChunkedStream以从nextChunk返回null (在没有线程挂起的情况下“挂起”写入),所以在写入相关通道的PipedOutputStream之后我调用resumeTransfer 。 当我调试并逐步执行代码时,我可以看到正在调用ChunkedWriteHandler flush ,它会调用: Channels.write(ctx, writeFuture, chunk, currentEvent.getRemoteAddress()); 我写入PipedOutputStream,的字节数PipedOutputStream,但它从未被客户端接收过。 HTTPcurl ~ $ curl -vN http://localhost:8080/stream * About to connect() to localhost […]

Java NIO windows实现

在使用NIO.2 AIOfunction处理项目时,我查看了“旧的”NIO选择器实现,并在Windows上看到使用默认的select-function,由于内部实现不良,因此在Windows上根本无法扩展。 大家都知道,在Windows上IOCP是唯一真正的解决方案。 当然,回调完成模型不适合NIO选择器模型,但这是否有效意味着在Windows上使用NIO基本上不是一个好主意? 例如:新的AIOfunction包括IOCP实现。 在使用支持AIO的最新Netty框架时,尤其如此。 那么Netty在Windows上的速度并不像它那么快?

具有Netty的multithreadingUDP服务器

我正在尝试使用Netty实现UDP服务器。 想法是只绑定一次(因此只创建一个Channel )。 此Channel仅使用一个处理程序进行初始化,该处理程序通过ExecutorService在多个线程之间调度传入数据报的处理。 @Configuration public class SpringConfig { @Autowired private Dispatcher dispatcher; private String host; private int port; @Bean public Bootstrap bootstrap() throws Exception { Bootstrap bootstrap = new Bootstrap() .group(new NioEventLoopGroup(1)) .channel(NioDatagramChannel.class) .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .handler(dispatcher); ChannelFuture future = bootstrap.bind(host, port).await(); if(!future.isSuccess()) throw new Exception(String.format(“Fail to bind on [host = %s , port = […]

下游事件如何在jboss的网络中运行?

刚刚开始使用netty来实现我自己的服务器。 我花了一些时间来掌握它,但现在我能够通过编写自己的MessageHandler接受客户端并在内部消息接收我能够从缓冲区读取并做了一些与收到的数据相关的业务逻辑。 但现在的问题是,如何将数据写入连接的客户端? 我看到了示例代码,如果出现这样的新消息,您可以在其中写入通道: public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { Channel ch = e.getChannel(); ch.write(e.getMessage()); } 但是如果你不想在那时写回数据呢? 如果客户端在套接字中保持连接并等待服务器中发生某些事件,该怎么办? 在那种情况下,我的服务器将如何找到要写入的正确套接字? 我想保留对通道对象的引用吗? 这是惯例吗? 我进一步研究了代码并看到了一个名为writeRequested的方法。 这有关系吗? 谁叫那个? 它需要吗?