//
// Chateo.java
//

import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class Chateo implements Runnable {

   Thread _listener;
   ServerSocket _server;
   Socket _socket;
   BufferedReader _input;
   PrintWriter _output;
   BufferedReader _userInput;

   public Chateo (int portNumber) throws Exception {
      _server = new ServerSocket(portNumber);
      _userInput = new BufferedReader(new InputStreamReader(System.in));
   }

   public void run () {
      try {
         String str;
         while ((str = _input.readLine()) != null) {
            System.out.println("+ \"" + str + "\"");
         }
      } catch (Exception e) { }
      System.out.println("Disconnected.");
      System.exit(0);
   }

   public void startService () throws Exception {
      System.out.println("Waiting for guest to connect...");
      _socket = _server.accept();
      _input = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
      _output = new PrintWriter(_socket.getOutputStream());
      System.out.println("Guest connected.");
      _output.println("Connected to " + InetAddress.getLocalHost().toString());
      System.out.println("Connected to " + _socket.getInetAddress().toString());
      _output.flush();

      // This thread will let us receive data while typing
      _listener = new Thread(this);
      _listener.start();

      // Read lines till the end of time
      String str;
      do {  
         str = _userInput.readLine();
         if (str == null)
            break;
         _output.println("+ \"" + str + "\"");
         _output.flush();
      } while (true);

      // Finish closing the socket
      _socket.close();
      return;
   }

   public static void main (String[] args) {
      if (args.length != 1) {
         System.out.println("java Chateo [port number]");
         System.exit(0);
      }

      try {
         int portNumber = Integer.parseInt(args[0]);
         Chateo chateo = new Chateo(portNumber);
         chateo.startService();

      } catch (Exception e) {
         System.out.println(e);
      }
   }

}  // End of class
