Android 開發技巧之Log發送UDP報文,Socket編程

和把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());
				}
			}
		}
	}
}

效果圖:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章