Android使用Netty网络框架实践(客户端、服务端)
使用开发工具为Android Studio
1、配置build.gradle文件
build.gradle文件的dependencies标签下添加Netty引用
dependencies {
api 'io.netty:netty-all:5.0.0.Alpha2'
}
2、主要代码
1. 消息处理类
实现Netty网络访问模块与外部交互
①定义一个交互类型类MessageType
public class MessageType {
/**
* 接收到数据
* */
public static final int RECEIVE_DATA = 1;
/**
* 服务端异常
* */
public static final int SERVER_EXCEPTION = 100;
/**
* 服务启动成功
* */
public static final int SERVER_START_SUCCESS = 101;
/**
* 服务启动失败
* */
public static final int SERVER_START_FAILED = 102;
/**
* 服务端被客户端连接成功
* */
public static final int SERVER_CONNECT_SUCCESS = 103;
/**
* 服务端断开连接成功
* */
public static final int SERVER_DISCONNECT_SUCCESS = 105;
/**
* 服务端关闭成功
* */
public static final int SERVER_CLOSE_SUCCESS = 106;
/**
* 客户端异常
* */
public static final int CLIENT_EXCEPTION = 200;
/**
* 客户端连接服务成功
* */
public static final int CLIENT_CONNECT_SUCCESS = 203;
/**
* 客户端连接断服务失败
* */
public static final int CLIENT_CONNECT_FAILED = 204;
/**
* 客户端断开连接成功
* */
public static final int CLIENT_DISCONNECT_SUCCESS = 205;
/**
* 客户端关闭成功
* */
public static final int CLIENT_CLOSE_SUCCESS = 206;
}
②定义一个消息处理类 MessageHandler
public class MessageHandler {
private Handler handler;
private static MessageHandler instance = new MessageHandler();
public static MessageHandler getInstance() {
return instance;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
public void sendMessage(int code, Object data) {
if (handler != null) {
Message msg = new Message();
msg.what = code;
msg.obj = data;
handler.sendMessage(msg);
}
}
}
2. 心跳和收发数据处理类
①定义一个心跳数据传入接口HeartBeatListener
public interface HeartBeatListener {
byte[] getHeartBeat();
}
②实现数据收发处理和心跳处理DataHandlerAdapter
/**
* 数据收发处理类
* <p>接收处理</p>
* <p>发送处理</p>
* <p>心跳发送</p>
* @author liangc
* */
//因为客户端和服务端都有使用,必须添加此注释实现共享
@ChannelHandler.Sharable
public class DataHandlerAdapter extends ChannelHandlerAdapter {
private static final String TAG = "DataHandlerAdapter";
public enum ConnectType {
SERVER,
CLIENT,
}
private ConnectType type;
private ChannelHandlerContext channelHandlerContext;
private HeartBeatListener listener;
DataHandlerAdapter(ConnectType type) {
this.type = type;
}
@Override
public void channelActive(ChannelHandlerContext ctx) {
this.channelHandlerContext = ctx;
//连接成功
InetSocketAddress socketAddress = (InetSocketAddress)ctx.channel().remoteAddress();
String connectAddress = socketAddress.getAddress().getHostAddress();
if (type == ConnectType.SERVER) {
MessageHandler.getInstance().sendMessage(MessageType.SERVER_CONNECT_SUCCESS, connectAddress);
}
Log.w(TAG, "连接成功:" + connectAddress);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) {
this.channelHandlerContext = ctx;
Log.w(TAG, "连接断开");
if (type == ConnectType.CLIENT) {
MessageHandler.getInstance().sendMessage(MessageType.CLIENT_DISCONNECT_SUCCESS, "连接断开");
} else {
MessageHandler.getInstance().sendMessage(MessageType.SERVER_DISCONNECT_SUCCESS, "连接断开");
}
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
this.channelHandlerContext = ctx;
//接收数据
Log.w(TAG, "收到数据");
//取出数据
ByteBuf byteBuf = (ByteBuf)msg;
byte[] recvData = new byte[byteBuf.readableBytes()];
byteBuf.readBytes(recvData);
byteBuf.clear();
MessageHandler.getInstance().sendMessage(MessageType.RECEIVE_DATA, recvData);
}
@Override
public void write(ChannelHandlerContext ctx, Obj