和把Log写入文件的原因相同:http://blog.csdn.net/wyzxk888/article/details/7478152
就是因为Android开发过程中会出现手机offline,为了达到更加实时的查看日志信息,可以使用Java提供的Socket相关类,通过不断的发送UDP包达到效果。
手机端同样是一个单例类,用于发送日志消息:
package org.test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LogSender {
private static LogSender mLogSender;
private static DatagramSocket socket;
private static InetAddress serverAddress;
private static int port;
private static SimpleDateFormat df;
private LogSender(String host, int por) throws SocketException, UnknownHostException {
socket = new DatagramSocket();
port = por;
serverAddress = InetAddress.getByName(host);
}
public static LogSender create(String host, int port) throws SocketException, UnknownHostException {
if (mLogSender == null) {
mLogSender = new LogSender(host, port);
}
df = new SimpleDateFormat("[yy-MM-dd hh:mm:ss]: ");
return mLogSender;
}
public void close() {
socket.close();
}
public void print(String log) throws IOException {
log = df.format(new Date()) + log;
DatagramPacket pack = new DatagramPacket(log.getBytes(),
log.getBytes().length, serverAddress, port);
socket.send(pack);
}
public void print(Class cls, String log) throws IOException {
print(cls.getSimpleName() + " " + log);
}
}
用法和Log写入文件时一样的,生成实例,在需要打日志的地方print一下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
mLogSender = LogSender.create("192.168.1.184", 4567);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d(tag, e.getMessage());
}
log("onCreate()");
}
public void log(String msg) {
Log.d(tag, msg);
try {
mLogSender.print(AlarmManagerDemo.class, msg); //这里发送
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d(tag, e.getMessage());
}
}
除了上面之外,还需要写一个简单的Java服务端程序接受发过来的日志消息进行打印
public class ServerApp {
public static void main(String[] args) {
new Thread(new Server()).start();
}
private static class Server implements Runnable {
@Override
public void run() {
ServerSocket mServerSocket = null;
try {
mServerSocket = new ServerSocket(4567);
Socket client = mServerSocket.accept();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(client.getInputStream()));
while(true) {
String str = bufferedReader.readLine();
System.out.println(str);
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
mServerSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
}
}
}
效果图: