/*****************************************************************************
* Create a TCP/IP sniffer (a single connection)
* TCP server communication uses both a TCP server socket object and a TCP client socket object.
* A TCP server socket object is used to maintain an open socket connection to all clients.
* Using the accept() method, a TCP server socket will establish a new client socket. 
* When a TCP client socket is created you are assigned a port number by the O/S (next port#).
*
* PS. This server takes whatever is being sent to it, and displays it on the console
*
* Usage: serverSniff <serverPort>
* 
* @version 1.0
* @author Sam Sultan
*****************************************************************************/
import java.io.*;
import java.net.*;

public class serverSniff
{
    public static void main(String[] args)
	{
		if (args.length != 1) {
	    	System.out.println("Usage: serverSniffer <serverPort>");
	    	System.exit(0);
		}
	
		InetAddress serverIP;		//IP address object for server
		InetAddress clientIP;		//IP address object for client
	
		int serverPort;				//server port for listening
		int clientPort;				//port number for client

		ServerSocket TCPsocketS;	//TCP socket for listening
		Socket       TCPsocketC;	//TCP socket for communication

    	String recvString;			//string to convert receive array
		String sendString;			//string to convert send array

		try
		{
	    	serverIP   = InetAddress.getLocalHost();	//get local server addr
	    	serverPort = Integer.parseInt(args[0]);	//get server port number        

	    	System.out.println("Server Host Name.....: " + serverIP.getHostName());
	    	System.out.println("Server IP Address....: " + serverIP.getHostAddress());
	    	System.out.println("Server Port Requested: " + serverPort);
	    	System.out.println();

	    	TCPsocketS = new ServerSocket(serverPort);   //socket for listening 

	    	System.out.println("Waiting for client connection...... \n");

	    	TCPsocketC = TCPsocketS.accept();        //establish a client socket
	    											 //from the server socket

            System.out.println("Client connection openned to:");

	    	clientIP    = TCPsocketC.getInetAddress();	//get client IP address
	    	clientPort  = TCPsocketC.getPort();	   //get client port from socket 

	    	System.out.println("Client Host Name.....: " + clientIP.getHostName());
	    	System.out.println("Client IP Address....: " + clientIP.getHostAddress());
	    	System.out.println("Client Port Number...: " + clientPort);
	    	System.out.println();

	    	InputStream       socketIn1 = TCPsocketC.getInputStream();			//ref to socket input 
	    	InputStreamReader socketIn2 = new InputStreamReader(socketIn1);		//convert to 16 bit
	    	BufferedReader    socketIn  = new BufferedReader(socketIn2);		//to use readLine()

//	    	OutputStream       socketOut1 = TCPsocketC.getOutputStream();		//ref to socket output 
//	    	OutputStreamWriter socketOut2 = new OutputStreamWriter(socketOut1);	//convert to 16 bit
//	    	BufferedWriter     socketOut3 = new BufferedWriter(socketOut2);		//buffer output
//	    	PrintWriter        socketOut  = new PrintWriter(socketOut3);		//to use println()

	    	while(true)
			{
				/*------------------ receiving data ---------------------*/
	
				recvString = socketIn.readLine(); //receive data from the socket

				if((recvString==null) || recvString.trim().length()==0)  //empty 
		    		break;		

				System.out.println("Received: " + recvString);

//				socketOut.flush();				//flush buffer
	    	}

	    	System.out.println("Closing Socket to port: " + clientPort);
	    	socketIn.close();
//	    	socketOut.close();
	    	TCPsocketC.close();
	    	TCPsocketS.close();
		}

		catch(IOException e) {	
	    	System.out.println("I/O error: " + e);
	    	System.exit(-1);
		}
    }
}