/***********************************************************************************
* Christophe Béasse <oceank2@gmail.com>, Copyright (C) 2011. All rights reserved. *
************************************************************************************/
package org.javascool.proglets.txtCode;
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="SocketClient.java.html">source code</a>
* @serial exclude
* @deprecated
* ATTENTION CETTE CLASSE EST DEPRECIEE : UTILISER org.javascool.tools.socket.SocketClient SVP.
* @author Christophe Béasse <oceank2@gmail.com>
*/
@Deprecated
public class SocketClient {
// Variables de la socket
private Socket socket;
private BufferedReader plec;
private PrintWriter pred;
/** Ouvre le port de dialogue de la socket pour initier le dialogue.
* @param host Nom du serveur sur lequel se connecter. <ul>
* <li>Si un nom de machine est donné, ouvre une socket client qui se connecte à la socket serveur de la machine donnée.</li>
* <li>Si le nom est "localhost" ou la valeur est nulle, ouvre une socket client qui se connecte à la socket serveur sur la machine locale.</li>
* </ul>
* @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 SocketClient socket= new SocketClient().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 SocketClient open(String host, int port) {
try {
socket = new Socket(host, port);
if (socket == null)
throw new RuntimeException("Impossible d'ouvrir une socket sur le port "+port+" du host "+host);
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) {}
}
/** 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