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