netty udp编程

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();
	}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Netty是一种基于Java网络通信框架,它提供了高度灵活和可扩展的功能,可以用于开发各种类型的网络应用程序。其中,Netty支持TCP和UDP两种传输协议。 TCP(Transmission Control Protocol)是一种面向连接的协议,它能够提供可靠的数据传输。TCP通过三次握手建立连接,并通过流量控制和拥塞控制机制来保证数据的可靠性。在使用TCP协议时,数据的传输是一对一的,即每个数据包从发送方到接收方都会经过一个确定的路径。 UDP(User Datagram Protocol)是一种面向无连接的协议,它不保证数据的可靠传输。UDP在数据的发送方和接收方之间建立一个简单的交互,数据包通过广播方式发送,不保证数据包的顺序和完整性。UDP适用于实时性要求较高的应用场景,如音频、视频、游戏等。 在Netty中,无论是TCP还是UDP,都可以通过使用Channel来进行创建和管理。对于UDP来说,Netty提供了DatagramChannel来处理UDP数据包的发送和接收。而对于TCP来说,Netty提供了SocketChannel来处理TCP连接的建立和数据的传输。 Netty使用NIO(Non-blocking I/O)实现网络通信,通过事件驱动机制和高效的线程池来处理网络I/O操作。无论是TCP还是UDP,都可以通过设置相应的ChannelHandler来处理数据的编码、解码、读取和写入操作。 总之,Netty是一种强大的网络通信框架,支持TCP和UDP两种传输协议。它提供了丰富的功能和简化的API,可以大大简化网络应用程序的开发和管理。无论是开发高性能服务器还是实时应用程序,Netty都是一个非常好的选择。 ### 回答2: Netty是一个开源的高性能网络应用框架,它支持多种协议,包括UDP和TCP。UDP(User Datagram Protocol)是一种无连接的传输协议,它在应用层和传输层之间提供了一种简单的、不可靠的传输服务。UDP主要用于传输实时数据,如音频和视频流等,因为它具有较低的延迟和较小的数据包头开销。UDP不保证数据的可靠传输,因此在使用UDP时需要自己处理丢包、乱序等问题。 而TCP(Transmission Control Protocol)是一种面向连接的传输协议,它提供了可靠的、有序的数据传输服务。TCP在应用层和传输层之间建立了一个可靠的、全双工的、面向字节流的连接。TCP通过序号、确认和重传机制等保证了数据的可靠性和有序性。TCP适用于传输对数据完整性要求较高的应用,如网页浏览、文件传输等。 NettyUDP和TCP协议之上提供了统一的编程模型和高度可配置的网络应用框架。它能够有效地处理网络传输中的各种问题,如拆包、粘包、流量控制等。通过使用Netty,开发者可以方便地实现各种基于UDP和TCP的网络应用,而无需关注底层网络细节。 总结来说,Netty是一个强大的网络应用框架,它支持UDP和TCP等多种协议,并提供了统一的编程模型,使开发者能够更便捷地开发高性能的网络应用。无论是实时的UDP应用还是可靠的TCP应用,Netty都能提供高效、稳定的网络传输服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值