package tmp.net.netty.udp; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ConnectionlessBootstrap; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelUpstreamHandler; import org.jboss.netty.channel.socket.DatagramChannel; import org.jboss.netty.channel.socket.nio.NioDatagramChannelFactory; import org.jboss.netty.handler.codec.frame.FixedLengthFrameDecoder; public class NettyUdp { private int size; private ConnectionlessBootstrap b; private DatagramChannel datagramChannel; public NettyUdp(int port, int size) { super(); this.size = size; init(port); } private void init(int port){ b = new ConnectionlessBootstrap(new NioDatagramChannelFactory(Executors.newCachedThreadPool())); b.setOption("tcpNoDelay", true); b.setOption("receiveBufferSize", 1048576); // 1M b.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("stick", new FixedLengthFrameDecoder(size)); pipeline.addLast("decoder", new UDPDecoder(size)); pipeline.addLast("encoder", new UDPEncoder(size)); pipeline.addLast("logic", new MyHandler()); return pipeline; } }); datagramChannel = (DatagramChannel) b.bind(new InetSocketAddress(port)); System.out.println(" Server is starting ……"); } public void writeString(String message, String remoteHost, int remotePort) { datagramChannel.write(message, new InetSocketAddress(remoteHost, remotePort)); } public static void main(String[] args) throws IOException { new NettyUdp(1000, 100); } public void shutdown(){ if(datagramChannel != null){ datagramChannel.close(); } if(b != null){ b.releaseExternalResources(); } } } class MyHandler extends SimpleChannelUpstreamHandler { @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { System.out.println(e.getRemoteAddress() + " ->:" + e.getMessage()); // e.getChannel().write(message, remoteAddress) } }
编码器:
package tmp.net.netty.udp; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneEncoder; class UDPEncoder extends OneToOneEncoder { public static final char BLANK = ' '; private int size; public UDPEncoder(int size) { super(); this.size = size; } @Override protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { if(!(msg instanceof String)){ return msg; } String message = (String) msg; byte[] body = message.getBytes("UTF-8"); ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); buf.writeBytes(body); fill(buf, size - body.length); return buf; } private void fill(ChannelBuffer buf, int size) { for (int i = 0; i < size; i++) { buf.writeByte(BLANK); } } }
解码器:
package tmp.net.netty.udp; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.frame.FrameDecoder; class UDPDecoder extends FrameDecoder { private int size; public UDPDecoder(int size) { super(); this.size = size; } @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { byte[] body = new byte[size]; buffer.readBytes(body); return new String(body, "UTF-8").trim(); } }
测试服务端:
public static void main(String[] args) throws Exception { new NettyUdp(1000, 100); }
测试客户端:
public static void main(String[] args) { NettyUdp udp = new NettyUdp(1001, 100); for(int i=0; i<5; i++){ udp.writeString("中国", "127.0.0.1", 1000); } // udp.shutdown(); }
相关推荐
在UDP网络打洞实例中,Netty的优势在于其强大的网络编程能力和灵活性,能够帮助开发者高效地处理UDP数据报文。 首先,理解UDP网络打洞的基本原理。网络打洞通常涉及到STUN(Session Traversal Utilities for NAT)...
在Java编程环境中,Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可伸缩、高并发的服务器。本示例关注的是如何利用Netty实现一个基于UDP(User Datagram Protocol)的数据接收服务,这在需要进行...
Netty本身的API设计清晰,易于理解和使用,使得Java开发者能够快速上手网络编程。 总的来说,这个项目涵盖了网络协议(UDP和TCP)、数据解析(JSON)、协议对接、以及Java和Netty框架的使用。通过深入理解这些知识...
总的来说,Netty通过其强大的功能和简单易用的API,极大地降低了网络编程的复杂性,是构建高性能网络应用,尤其是TCP和UDP服务的首选框架。无论是在物联网、游戏服务器、大数据传输还是其他分布式系统中,Netty都能...
在这个“netty之UDP协议开发”的项目中,我们将探讨如何使用Netty实现基于UDP(用户数据报协议)的应用。 UDP是一种无连接的、不可靠的传输层协议,它不保证数据包的顺序或完整性,但其速度较快,适合于对实时性...
《基于Netty网络编程项目实战笔记》是一份深入探讨Netty框架在实际网络编程中的应用文档。Netty,作为一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种网络应用开发,包括服务器和客户端的实现。这份...
在 Netty 中,UDP 编程可以通过使用 `DatagramChannel` 实现,提供了异步的、事件驱动的网络编程模型。Netty 提供了一个简洁的 API,开发者可以快速的创建高性能的 UDP 服务器和客户端程序。 在上面的代码中,我们...
### Netty教程并发编程知识点详解 #### 一、Netty简介与并发模型基础 ##### 1.1 Netty概述 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器与客户端。它提供了对TCP、...
在这个实例中,我们用到了MINA2或Netty4这两个流行的NIO库,它们提供了高级API,简化了网络编程的复杂性。 MINA2是一个可扩展的、高性能的网络应用框架,支持TCP和UDP协议,适用于多种应用,包括Android。它为...
我们可以通过添加对应的依赖来引入Netty,例如在`pom.xml`中加入`spring-boot-starter-webflux`,这个依赖集成了Reactor Netty,它是Spring Framework 5.x对响应式编程的支持,底层就是基于Netty实现的。 接下来,...
这个项目实战笔记主要涵盖了Netty的核心概念、设计模式以及如何在实际项目中运用Netty进行网络编程。 首先,Netty的核心概念包括通道(Channel)和处理器(Handler)。通道是Netty中的基本I/O抽象,它代表一个连接...
在现代的网络编程中,Netty作为一个高性能、异步事件驱动的网络应用框架,被广泛应用于构建高并发、低延迟的服务器。而SpringBoot作为Spring框架的轻量级启动器,能够简化微服务的开发流程。本篇将详细讲解如何利用...
- UDP案例:Netty的NioDatagramChannel处理UDP通信,同样通过ChannelPipeline管理解码和编码过程。 7. Netty线程模型 - Reactor模式:主从Reactor模型,通过NioEventLoop处理I/O事件,ChannelHandler处理业务逻辑...
总的来说,Netty4+ProtoBuf通信框架结合了Netty的网络编程能力与ProtoBuf的数据序列化效率,提供了一种高效、可靠的客户端和服务端通信解决方案。对于Java开发者来说,理解并掌握这种框架有助于开发高性能的网络应用...
事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精 心的设计Reactor线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下...
Netty 是一个高性能、...通过封装 HTTP、TCP 和 UDP,Netty 提供了一种统一的方式来处理多种网络通信方式,简化了网络编程的复杂性。学习并掌握 Netty,可以提升你在网络编程领域的专业技能,为你的职业生涯增添价值。
它提供了对TCP、UDP、HTTP、HTTPS、WebSocket等常见网络协议的支持,简化了网络编程的复杂性。Netty以其高效的性能、丰富的功能和易用的API,在高并发、低延迟的场景下得到了广泛应用,如游戏服务器、金融交易系统、...
在编程中,这通常通过调用socket函数创建套接字,然后使用bind函数绑定IP和端口。 - 接下来,服务器通过调用recvfrom函数监听网络,等待来自客户端的数据包。这个函数会阻塞,直到有数据到达。 - 当数据包到达时,...
**NIO(非阻塞I/O)与Netty编程**是现代Java网络应用开发中的重要技术,它们在处理高并发、低延迟的网络通信场景中起着关键作用。本讲义详细介绍了这两种技术,旨在帮助开发者更好地理解和运用它们。 ### 一、BIO...