參考:https://www.jianshu.com/p/c78b37a2ca47
與安卓交互需要用到 特此記錄
public class NettyClient {
public final static String HOST = "192.168.31.178";
public final static int PORT = 9527;
private static EventLoopGroup workerGroup = null;
private Channel channel;
//重連調用的函數
public Channel connect(String host, int port) {
doConnect(host, port);
return this.channel;
}
public void doConnect(String host, int port) {
try {
//設置一個多線程循環器
workerGroup = new NioEventLoopGroup();
//啓動附註類
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(workerGroup);
//指定所使用的NIO傳輸channel
bootstrap.channel(NioSocketChannel.class);
//指定客戶端初始化處理
bootstrap.handler(new ClientIniterHandler());
//連接服務
// Channel channel = bootstrap.connect(host, port).sync().channel();
ChannelFuture f = bootstrap.connect(host, port);
f.addListener(new ConnectionListener());
channel = f.channel();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
public class ConnectionListener implements ChannelFutureListener {
private NettyClient nettyClient = new NettyClient();
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (!channelFuture.isSuccess()) {
final EventLoop loop = channelFuture.channel().eventLoop();
loop.schedule(new Runnable() {
@Override
public void run() {
Log.e("ConnectionListener: " ,"服務端鏈接不上,開始重連操作.." );
nettyClient.connect(NettyClient.HOST, NettyClient.PORT);
}
}, 1L, TimeUnit.SECONDS);
} else {
Log.e("ConnectionListener: " ,"服務端鏈接成功..." );
}
}
}
//有異常 關閉
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
super.exceptionCaught(ctx, cause);
ctx.close();
}
//服務端突然掛了
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
Log.e("channelInactive: " ,"掉線了..." );
//使用過程中斷線重連
final EventLoop eventLoop = ctx.channel().eventLoop();
eventLoop.schedule(new Runnable() {
@Override
public void run() {
nettyClient.connect(NettyClient.HOST, NettyClient.PORT);
}
}, 1L, TimeUnit.SECONDS);
super.channelInactive(ctx);
}