Netty4.0入门

<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-all</artifactId>
			<version>4.0.34.Final</version>
		</dependency>

构建服务器:

/**
 * 
 */
package com.zuk.server;

import io.netty.bootstrap.ServerBootstrap;
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;

public class ZukServer {
	
	public static void main(String[] args) {
		
		ServerBootstrap server = new ServerBootstrap();
		try {
			EventLoopGroup parentGroup = new NioEventLoopGroup();
			EventLoopGroup childGroup = new NioEventLoopGroup();
			server.group(parentGroup, childGroup);
			
			server.channel(NioServerSocketChannel.class);
			
			server.childHandler(new ChannelInitializer<SocketChannel>() {
				@Override
				public void initChannel(SocketChannel ch) throws Exception {
					//接受消息解码
					ch.pipeline().addLast(new ZukServerRequestDecoder());
					//消息处理
					ch.pipeline().addLast(new ZukServerHandler());
					//返回消息编码
					ch.pipeline().addLast(new ZukServerResponseEncoder());
					
				}
			});
			
			server.option(ChannelOption.SO_BACKLOG, 2048);// 链接缓冲池队列大小
			server.bind(10102).sync();
			
			System.out.println("server started.");
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}

}

消息解码

/**
 * 
 */
package com.zuk.server;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @author HUANGLIAO322
 * 解析消息
 */
public class ZukServerRequestDecoder extends ByteToMessageDecoder{
	

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
		

		System.out.println("ZukRequestDecoder.decode");
		
		if(buffer.readableBytes()>0){
			byte[] data = new byte[buffer.readableBytes()];
			buffer.readBytes(data);
			String str = new String(data);
			System.out.println("str:"+str);
			//解析出消息对象,继续往下面的handler传递
			out.add(str);
		}
		else
		{
			System.out.println("buffer is zero.");
		}
		

		
		//数据不完整,等待完整的数据包
		return ;
	}
}

消息处理

/**
 * 
 */
package com.zuk.server;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

/**
 * @author HUANGLIAO322
 *
 */
public class ZukServerHandler  extends SimpleChannelInboundHandler<Object> {

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, Object msg)
			throws Exception {
		System.out.println("msg:"+msg);
		Channel channel = ctx.channel();
		channel.writeAndFlush("hi,"+msg+",i'm from server.");
	}

}

消息编码

/**
 * 
 */
package com.zuk.server;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

import com.alibaba.fastjson.JSON;

/**
 * @author HUANGLIAO322
 *
 */
public class ZukServerResponseEncoder extends MessageToByteEncoder<Object>{

	@Override
	protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf buffer)
			throws Exception {
		System.out.println("ZukResponseEncoder.encode:"+JSON.toJSON(msg));
		buffer.writeBytes(((String)msg).getBytes());

	} 
	
}

构建客户端

/**
 * 
 */
package com.zuk.client;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

import java.net.InetSocketAddress;

public class ZukClient {

	public static void main(String[] args) throws Exception {
		
		Bootstrap bootstrap = new Bootstrap();
		
		EventLoopGroup group = new NioEventLoopGroup();
		bootstrap.group(group);
		
		bootstrap.channel(NioSocketChannel.class);
		
		bootstrap.handler(new ChannelInitializer<SocketChannel>() {
			@Override
			public void initChannel(SocketChannel ch) throws Exception {
				ch.pipeline().addLast(new ZukClientResponseDecoder());
				ch.pipeline().addLast(new ZukClientRequestEncoder());
				ch.pipeline().addLast(new ZukClientHandler());
			}
		});
		
		// 连接服务端
		ChannelFuture connect = bootstrap.connect(new InetSocketAddress("127.0.0.1", 10102));
		connect.sync();
		Channel channel = connect.channel();
		
		int i = 0;
		while(i++<100){
			Thread.sleep(1000);
			channel.writeAndFlush("pafc_"+i);
		}
		
		channel.close();
		
	}
	
}

客户端消息处理

/**
 * 
 */
package com.zuk.client;

import com.alibaba.fastjson.JSON;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

/**
 *
 */
public class ZukClientHandler extends SimpleChannelInboundHandler<Object> {

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, Object msg)
			throws Exception {
		System.out.println("ZukClientHandler.msg:"+JSON.toJSONString(msg));
	}

}
package com.zuk.client;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

import com.alibaba.fastjson.JSON;
import com.cn.common.core.model.RequestMessage;
 
public class ZukClientRequestEncoder extends MessageToByteEncoder<Object>{

	@Override
	protected void encode(ChannelHandlerContext ctx, Object obj, ByteBuf buffer) throws Exception {

		System.out.println("ZukResponseEncoder.encode:"+JSON.toJSON(obj));
		buffer.writeBytes(((String)obj).getBytes());
		

	}
}
package com.zuk.client;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

import com.cn.common.core.model.Response;
 
public class ZukClientResponseDecoder extends ByteToMessageDecoder{
	
	/**
	 * 数据包基本长度
	 */
	public static int BASE_LENTH = 4 + 2 + 2 + 4 + 4;

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
		
		System.out.println("ZukClientResponseDecoder.decode");
		
		if(buffer.readableBytes()>0){
			byte[] data = new byte[buffer.readableBytes()];
			buffer.readBytes(data);
			String str = new String(data);
			System.out.println("str:"+str);
			//解析出消息对象,继续往下面的handler传递
			out.add(str);
		}
		else
		{
			System.out.println("buffer is zero.");
		}
		
//		while(true){
//			if(buffer.readableBytes() >= BASE_LENTH){
//				//第一个可读数据包的起始位置
//				int beginIndex;
//				
//				while(true) {
//					//包头开始游标点
//					beginIndex = buffer.readerIndex();
//					//标记初始读游标位置
//					buffer.markReaderIndex();
//					if (buffer.readInt() == ConstantValue.HEADER_FLAG) {
//						break;
//					}
//					//未读到包头标识略过一个字节
//					buffer.resetReaderIndex();
//					buffer.readByte();
//					
//					//不满足
//					if(buffer.readableBytes() < BASE_LENTH){
//						return ;
//					}
//				}
//				//读取模块号命令号
//				short module = buffer.readShort();
//				short cmd = buffer.readShort();
//				
//				int stateCode = buffer.readInt();
//				
//				//读取数据长度 
//				int lenth = buffer.readInt();
//				if(lenth < 0 ){
//					ctx.channel().close();
//				}
//				
//				//数据包还没到齐
//				if(buffer.readableBytes() < lenth){
//					buffer.readerIndex(beginIndex);
//					return ;
//				}
//				
//				//读数据部分
//				byte[] data = new byte[lenth];
//				buffer.readBytes(data);
//				
//				Response response = new Response();
//				response.setModule(module);
//				response.setCmd(cmd);
//				response.setStateCode(stateCode);
//				response.setData(data);
//				//解析出消息对象,继续往下面的handler传递
//				out.add(response);
//			}else{
//				break;
//			}
//		}
		//数据不完整,等待完整的数据包
		return ;
	}

}

猜你喜欢

转载自blog.csdn.net/qq5132834/article/details/85165423
今日推荐