Socket et Threads

Socket et Threads - Java - Programmation

Marsh Posté le 01-03-2005 à 23:49:44    

Bonsoir,
 
j'ai un petit soucis avec une exception dans l'implémentation d'un serveur.Voici le code:
 
- le serveur
 
    while(true){
  clientSocket = serverSocket.accept();
 
  System.out.println("Connexion de "+ clientSocket.getInetAddress().getHostName());
 
  // Création du thread
  (new HttpRequest(clientSocket)).start();
  clientSocket.close();
     }

 
- le thread
 
public class HttpRequest extends Thread{
    private Socket connexion = null;
     
    public HttpRequest(Socket clientSocket){
 System.out.println("Entrée dans Thread\n" );
 this.connexion = clientSocket;
 
    }
    public void run(){
 String input = null;
 BufferedReader in = null;
 PrintWriter out = null;
 
 try{
     in = new BufferedReader(
       new InputStreamReader(connexion.getInputStream()));
     out = new PrintWriter(connexion.getOutputStream(),true);
 }
 catch (IOException e) {
     System.out.println("Erreur flux Input et Output du socket: " + e);
 }
 
................

 
et l'erreur à la suite de l'initialisation des variables in et ou
 
Erreur flux Input et Output du socket: java.net.SocketException: Socket is closed
java.lang.NullPointerException
        at HttpRequest.run(HttpRequest.java:46)

 
Je ne comprend pas pourquoi il me sort cette exception.
Si qq1 voit l'erreur :)
 
thx
SHiSo

Reply

Marsh Posté le 01-03-2005 à 23:49:44   

Reply

Marsh Posté le 03-03-2005 à 17:07:34    

Bon, je suis un peu rouille en Java, mais je ne pense pas me tromper...
 
Dans ton code cote serveur, tu acceptes la connexion cliente, tu crees un nouveau thread auquel tu passe la connexion; a partir de la, le thread vit sa vie, mais le serveur aussi. Et la c'est le drame, tu fermes la connexion cote serveur.
Resultat, meme si ton thread a un objet clientSocket valide, la connexion sous-jacente a ete fermee par le serveur...
 
Resultat, retire la ligne "clientSocket.close();" de ton code serveur et laisse la gestion de cette action au thread vu que tu lui delegue justement la gestion de la connexion.
 
Si ton applis doit gerer un grand nombre de connexion, n'hesite pas a faire appel a un pool de thread plutot que d'en creer un nouveau a chaque fois et eventuellement crees un thread special pour 'nettoyer' les connexions en fin de vie (en gros qui se charge de fermer les sockets)
 
Je ne pense pas t'avoir induit en erreur, mais si c'est le cas, desole ;)


Message édité par mordicator le 03-03-2005 à 17:09:23
Reply

Marsh Posté le 04-03-2005 à 19:29:20    

Il faut que tu ferme le socket uniquement apres avoir fini l'envoi de données demandées par la requete.


---------------
J.C. Farinet
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed