/***********************************************************************************
 * Christophe Béasse <oceank2@gmail.com>, Copyright (C) 2011.  All rights reserved. *
 ************************************************************************************/

package org.javascool.proglets.ticTacToe;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.net.UnknownHostException;

/** Définit un dialogue minimal via une socket entre deux programmes.
 @see <a href="SocketServer.java.html">source code</a>
 @serial exclude
 @deprecated
 * ATTENTION CETTE CLASSE EST DEPRECIEE : UTILISER org.javascool.tools.socket.SocketServer SVP.
 @author Christophe Béasse <oceank2@gmail.com>
 */
@Deprecated
public class SocketServer {
  // Variables de la socket
  private ServerSocket server;
  private Socket socket;
  private BufferedReader plec;
  private PrintWriter pred;

  /** Ouvre le port de dialogue de la socket pour initier le dialogue.
   @param port Numéro de port de la socket.
   <p>Choisir un numéro entre <a href="http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers">49152 et 65535</a> garantit de ne pas interférer avec les autres services TCP/UDP.</p>
   @return Cet objet, permettant de définir la construction SocketServer socket= new SocketServer().open(..).
   *
   @throws IllegalArgumentException Si le serveur n'existe pas: c'est à dire que le nom de machine est erronné ou qu'il n'y pas de socket à connecter.
   @throws RuntimeException Si il y a une erreur d'entrée sortie (par exemple que les autorisations interdisent la connection).
   */
  public SocketServer open(int port) {
	try {
	  server = new ServerSocket(port);
	  if(server == null) { throw new RuntimeException("Impossible d'ouvrir une serveur sur le port " + port);
	  }
	  socket = server.accept();
	  if(socket == null) { throw new RuntimeException("Impossible d'ouvrir une socket sur le port " + port);
	  }
	  plec = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	  pred = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))true);
	catch(UnknownHostException e1) { throw new IllegalArgumentException("Erreur serveur inconnu ou inacessible (" + e1 + ")");
	catch(SecurityException e2) { throw new RuntimeException("Erreur les mécanismes de sécurité interdisent d'utiliser cette fonction (" + e2 + ")");
	catch(IOException e3) { throw new RuntimeException("Erreur d'entrée sortie à la création de la socket (" + e3 + ")");
	}
	return this;
  }
  /** Ferme la socket pour libérer le port de dialogue. */
  public void close() {
	try {
	  if(plec != null) {
		plec.close();
	  }
	  plec = null;
	catch(IOException e) {}
	{
	  if(pred != null) {
		pred.close();
	  }
	  pred = null;
	}
	try {
	  if(socket != null) {
		socket.close();
	  }
	  socket = null;
	catch(IOException e) {}
	try {
	  if(server != null) {
		server.close();
	  }
	  server = null;
	catch(IOException e) {}
  }
  /** Renvoie la socket actuellement utilisée.
   @return La socket utilisée ou null si il n'y en a paas d'ouverte.
   */
  public Socket getSocket() {
	return socket;
  }
  /** Envoie un message.
   @param text Le message à envoyer.
   @throws RuntimeException Si il y a une erreur d'entrée sortie.
   */
  public void sendMessage(String text) {
	if(pred != null) {
	  pred.println(text);
	}
  }
  /** Renvoie le message reçu.
   @return Le message reçu (qui sera donc effacé) ou la valeur null si il n'y a pas de message.
   @throws RuntimeException Si il y a une erreur d'entrée sortie.
   */
  public String getMessage() {
	try {
	  return plec == null null : plec.readLine();
	catch(IOException e) { throw new RuntimeException("Erreur d'entrée sortie à la lecture du message sur la socket client (" + e + ")");
	}
  }
}

// Ref: http://www.cafeaulait.org/slides/sd2003west/sockets/Java_Socket_Programming.html
// Ref: http://download.oracle.com/javase/tutorial/networking/sockets/clientServer.html