最近做了一个TCP连接android与单片机的项目。记录一下。
TCP连接对象
首先是TCP连接,以前没有做过,摘抄的同事项目中TCP连接对象。
public class TCPChannel {
private SocketChannel myChannel = null;
private boolean isConnecting = true;
private boolean isConnected = false;
// 发送心跳包的线程是否已经关闭
private boolean isSendHeartBreak = false;
private Selector selector = null;
private Iterator<SelectionKey> iterator;
private SelectionKey key;
private String mac = "";
private SocketAddress address;
private int timeOut;
private Thread heartbeat;
private int heartCunt = 0;
private boolean isWaitHeart = false;
public TCPChannel(SocketChannel socketChannel, SocketAddress address,
int timeOut) {
// TODO Auto-generated constructor stub
myChannel = socketChannel;
this.address = address;
this.timeOut = timeOut;
try {
LogUtil.e("selector open is will run open!!");
selector = Selector.open();
} catch (IOException e) {
LogUtil.e("Selector.open() is wrong XXXX");
e.printStackTrace();
}
}
public void connect() throws IOException, NullPointerException {
LogUtil.e("connect is be runned!!");
isConnecting = true;
isConnected = false;
System.out.println(myChannel.toString());
myChannel.configureBlocking(false);
if (selector == null)
throw new NullPointerException(mac);
myChannel.register(selector, SelectionKey.OP_CONNECT
| SelectionKey.OP_READ | SelectionKey.OP_WRITE);
myChannel.connect(address);
// System.out.println("检查TCP连接:" + checkConnect());
if (checkConnect()) {
LogUtil.e("checkConnect return true");
} else {
this.close();
LogUtil.e("checkConnect return false");
}
}
public void reConnect() {
Log.w("重练空调", "准备开始");
if (!isConnected) {
return;
}
isConnecting = true;
isConnected = false;
if (heartbeat != null) {
heartbeat.interrupt();
} else {
System.out.println("重连接时候心跳为空");
// sendHeartbeat();
}
try {
Log.w("重练空调", "关闭连接");
myChannel.socket().close();
myChannel.close();
selector.close();
myChannel = SocketChannel.open();
try {
selector = Selector.open();
} catch (IOException e) {
Log.e("----->", "Selector.open()错误2");
e.printStackTrace();
}
Log.w("重练空调", "正在重连");
try {
connect();
} catch (NullPointerException e) {
isConnected = true;
Log.e("----->", e + "抛出空指针异常33");
}
if (!isConnected) {
Log.w("重练空调", "没有连上");
close();
} else {
Log.w("重练空调", "重连成功");
Log.i("----->12.4", "重连成功?" + heartCunt + " "
+ isSendHeartBreak);
// 在断开wifi的情况下,心跳线程异常会从而终止,此判断是如果心跳因为异常而终止则重新开启心跳
if (heartCunt < 3) {
if (isSendHeartBreak) {
// sendHeartbeat();
}
} else {
close();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ConcurrentModificationException e) {
e.printStackTrace();
close();
}
}
public boolea