本人从事多年的Android智能设备开发,做过手机、MiFi、智能门锁等产品,除了手机之外,其他的产品在后期的维护及版本迭代过程中,经常需要通过分析查看设备的日志来定位问题,比如智能门锁,遇到故障时,经常就抱着一台笔记本,打开设备的usb调试开关后,用usb线连接设备进行问题重现和日志分析。当然,获取日志的方式是多种多样的,也可以通过网络上传。但总免不了需要现场查看,现场查看就有个问题,笔记本并不是随身携带,而手机确实随身携带的,因此,能不能在手机端实时查看设备的日志呢?答案是肯定的。
MiFi和智能门锁都开放了热点,因此,调试的手机可以连接到设备的热点,进行组网后实现实时日志查看。这种方式既不需要数据线,也不需要笔记本,甚至usb调试开关也不用开启。
先说服务端(设备端),注意这里用到了线程池,因此服务端是具备了一对多进行响应的基础能力的:
/**
* @作用 开启tcp服务
*/
public void startTCP() {
if (runnableTcp != null) {
isStart = false;
runnableTcp = null;
}
try {
runnableTcp = new TcpReceive();
threadTcp = new Thread(runnableTcp);
isStart = true;
threadTcp.start();
} catch (Exception e) {
logd("开启TCP失败:" + e.getMessage());
}
try {
mExe = Executors.newCachedThreadPool();// 创建一个线程池
} catch (Exception e) {
logd("创建线程池失败:" + e);
}
}
private class TcpReceive implements Runnable {
Socket socket = null;
ServerSocket server = null;
public void run() {
try {
//server = new ServerSocket(53858);
if (server == null) {
server = new ServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(53858));
}
allSockets = new HashSet<Socket>();
while (isRunning) {
if (!server.isClosed()) {
//logd("serverSocket "+server.hashCode()+" 监听53858端口中...");
socket = server.accept();
}
if (socket != null) {
allSockets.add(socket);
//logd("新的socket " + socket.hashCode() + " 加入,当前socket总数为:" + allSockets.size());
mExe.execute(new EchoThread(socket));
}