import java.net.*;
import java.io.*;
import java.util.*;

/**
 * タイトル: TCPLogServerクラス
 * 説明: TCP/IPで受信したデータをすべてログに保存する
 * @author Jomora
 * @version 2001.09.13
 */

public class TCPLogServer extends Thread {

	static FileOutputStream fos;

	public TCPLogServer() {
	}
	public static void main(String[] args) throws IOException {

		TCPLogServer TCPLogServer1 = new TCPLogServer();

		int portNo = 21000;          // ポート番号
		ServerSocket serverSocket = null;
		Socket newSocket = null;
		try {
			//受信用のソケット作成する
			serverSocket = new ServerSocket(portNo);
			String s = serverSocket.toString();
			System.out.println("Listen: " + s);

			//保存するファイルを作成する
			fos = new FileOutputStream ("TCPLogServer.log" , true);

		} catch (IOException e) {
			System.err.println("Could not listen on port: " + portNo);
			System.exit(-1);
		}
		while (true) {
			newSocket = serverSocket.accept();
			System.out.println("Accepted.");
			new TCPLogServer(newSocket).start();
		}
	}


	// ------------以下は受信スレッドになる部分---------------------
	private Socket socket = null;

	public TCPLogServer(Socket socket) throws IOException {
		this.socket = socket;
		System.out.println("Thread was created.");
	}

	public void run() {
		byte[] buf = new byte[8760];
		String bufBuf = new String ("");

		try {
			String sSocket = socket.toString();
			System.out.println("Connect: " + sSocket);
			logOut("Connect: " + sSocket);
			InputStream in = socket.getInputStream();
			while (true) {
				int n = in.read(buf);
				if (n == -1) break;
				bufBuf += new String(buf , 0 , n);
				while (bufBuf.indexOf("\n") >= 0){
					// 改行コードまでを取り出す
					String writeBuf;
					writeBuf = bufBuf.substring(0,bufBuf.indexOf("\n"));
					bufBuf = bufBuf.substring(bufBuf.indexOf("\n") + 1);

					String buffer = new String();
					buffer = socket.getInetAddress().getHostAddress();
					buffer += "\t";

					buffer += "port:" + beamArg(socket.getPort(), 5) + " ";
	//				buffer +=  "size:" + n + " ";
					buffer += writeBuf;

					logOut (buffer);
				}
			}
			in.close();
			socket.close();
			System.out.println("Disconnected: " + sSocket);
			logOut("Disconnected: " + sSocket);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void logOut (String str){

		// 先頭に時刻を付ける
		Calendar now = Calendar.getInstance();
		str =   now.get(Calendar.YEAR) + "/" + beamArg((now.get(Calendar.MONTH)+1)) + "/" + beamArg(now.get(Calendar.DAY_OF_MONTH)) + " "
				+ beamArg(now.get(Calendar.HOUR_OF_DAY)) + ":" + beamArg(now.get(Calendar.MINUTE)) + ":" + beamArg(now.get(Calendar.SECOND)) + "." + beamArg(now.get(Calendar.MILLISECOND), 3)
				+ " " + str;
		// 最後に改行を付ける
		str += "\n";

		System.out.print (str);
		try {
			// 出力
			fos.write(str.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	String beamArg(int num) {
		return beamArg(num, 2);
	}
	String beamArg(String numstr) {
		return beamArg(numstr, 2);
	}
	String beamArg(int num, int beam) {
		String numstr = Integer.toString(num);
		return beamArg(numstr, beam);
	}
	String beamArg(String numstr, int beam) {
		numstr = "00000" + numstr;
		return numstr.substring(numstr.length() - beam);
	}

}