`
yuancihang
  • 浏览: 145402 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

netty udp编程

    博客分类:
  • java
阅读更多
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();
	}

 

 

 

分享到:
评论

相关推荐

    Netty UDP协议网络打洞实例

    在UDP网络打洞实例中,Netty的优势在于其强大的网络编程能力和灵活性,能够帮助开发者高效地处理UDP数据报文。 首先,理解UDP网络打洞的基本原理。网络打洞通常涉及到STUN(Session Traversal Utilities for NAT)...

    java实现基于netty 的udp字节数据接收服务

    在Java编程环境中,Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可伸缩、高并发的服务器。本示例关注的是如何利用Netty实现一个基于UDP(User Datagram Protocol)的数据接收服务,这在需要进行...

    基于java netty的udp客户端声呐数据对接

    Netty本身的API设计清晰,易于理解和使用,使得Java开发者能够快速上手网络编程。 总的来说,这个项目涵盖了网络协议(UDP和TCP)、数据解析(JSON)、协议对接、以及Java和Netty框架的使用。通过深入理解这些知识...

    netty搭建TCP、UDP服务

    总的来说,Netty通过其强大的功能和简单易用的API,极大地降低了网络编程的复杂性,是构建高性能网络应用,尤其是TCP和UDP服务的首选框架。无论是在物联网、游戏服务器、大数据传输还是其他分布式系统中,Netty都能...

    netty之UDP协议开发

    在这个“netty之UDP协议开发”的项目中,我们将探讨如何使用Netty实现基于UDP(用户数据报协议)的应用。 UDP是一种无连接的、不可靠的传输层协议,它不保证数据包的顺序或完整性,但其速度较快,适合于对实时性...

    基于Netty网络编程项目实战笔记.7z

    《基于Netty网络编程项目实战笔记》是一份深入探讨Netty框架在实际网络编程中的应用文档。Netty,作为一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种网络应用开发,包括服务器和客户端的实现。这份...

    java用netty写udp与tcp.pdf

    在 Netty 中,UDP 编程可以通过使用 `DatagramChannel` 实现,提供了异步的、事件驱动的网络编程模型。Netty 提供了一个简洁的 API,开发者可以快速的创建高性能的 UDP 服务器和客户端程序。 在上面的代码中,我们...

    netty教程并发编程

    ### Netty教程并发编程知识点详解 #### 一、Netty简介与并发模型基础 ##### 1.1 Netty概述 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器与客户端。它提供了对TCP、...

    一款Android平台UDP双向通信源码

    在这个实例中,我们用到了MINA2或Netty4这两个流行的NIO库,它们提供了高级API,简化了网络编程的复杂性。 MINA2是一个可扩展的、高性能的网络应用框架,支持TCP和UDP协议,适用于多种应用,包括Android。它为...

    springboot整合netty的demo

    我们可以通过添加对应的依赖来引入Netty,例如在`pom.xml`中加入`spring-boot-starter-webflux`,这个依赖集成了Reactor Netty,它是Spring Framework 5.x对响应式编程的支持,底层就是基于Netty实现的。 接下来,...

    基于Netty网络编程项目实战笔记.rar

    这个项目实战笔记主要涵盖了Netty的核心概念、设计模式以及如何在实际项目中运用Netty进行网络编程。 首先,Netty的核心概念包括通道(Channel)和处理器(Handler)。通道是Netty中的基本I/O抽象,它代表一个连接...

    boot-example-netty-udp-2.0.5

    在现代的网络编程中,Netty作为一个高性能、异步事件驱动的网络应用框架,被广泛应用于构建高并发、低延迟的服务器。而SpringBoot作为Spring框架的轻量级启动器,能够简化微服务的开发流程。本篇将详细讲解如何利用...

    Netty同步等待数据返回实例代码

    在 Netty 中,由于其异步编程模型,我们通常使用 Future 和 Promise 来处理同步等待。Future 表示一个可能还没有完成的异步操作的结果,而 Promise 是用来设置 Future 结果的对象。 下面是一个简单的 Netty 同步...

    netty网络编程.pdf

    - UDP案例:Netty的NioDatagramChannel处理UDP通信,同样通过ChannelPipeline管理解码和编码过程。 7. Netty线程模型 - Reactor模式:主从Reactor模型,通过NioEventLoop处理I/O事件,ChannelHandler处理业务逻辑...

    Netty4+ProtoBuf通信框架

    总的来说,Netty4+ProtoBuf通信框架结合了Netty的网络编程能力与ProtoBuf的数据序列化效率,提供了一种高效、可靠的客户端和服务端通信解决方案。对于Java开发者来说,理解并掌握这种框架有助于开发高性能的网络应用...

    NIO框架Netty实现高性能高并发

    事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精 心的设计Reactor线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下...

    netty网络框架,封装 http,tcp,udp的例子

    Netty 是一个高性能、...通过封装 HTTP、TCP 和 UDP,Netty 提供了一种统一的方式来处理多种网络通信方式,简化了网络编程的复杂性。学习并掌握 Netty,可以提升你在网络编程领域的专业技能,为你的职业生涯增添价值。

    网络编程之Netty一站式精讲.rar

    它提供了对TCP、UDP、HTTP、HTTPS、WebSocket等常见网络协议的支持,简化了网络编程的复杂性。Netty以其高效的性能、丰富的功能和易用的API,在高并发、低延迟的场景下得到了广泛应用,如游戏服务器、金融交易系统、...

    udp server client demo

    在编程中,这通常通过调用socket函数创建套接字,然后使用bind函数绑定IP和端口。 - 接下来,服务器通过调用recvfrom函数监听网络,等待来自客户端的数据包。这个函数会阻塞,直到有数据到达。 - 当数据包到达时,...

Global site tag (gtag.js) - Google Analytics