Java serveur multi client

Fermé
rom117 Messages postés 9 Date d'inscription dimanche 19 octobre 2008 Statut Membre Dernière intervention 24 novembre 2009 - 24 nov. 2009 à 01:21
 nickybutterfly - 20 févr. 2010 à 14:54
Bonjour.

Je veux réaliser un serveur où plusieurs clients peuvent se connecter. J'ai un fichier Serveur.java et Client.java. Je travaille sous Eclipse (en lançant plusieurs sessions).
Lorsqu'un client écrit un message, ça doit l'envoyer au serveur qui ensuite renvoie ce message à tous les autre clients.
Des le début ça bloque : si un client écrit un message, le premier est envoyé au serveur (mais uniquement au serveur) et si le client écrit un 2ème message là il y a une erreur : java.io.EOFException.
J'ai pu isoler la ligne où apparaît l'erreur : dans le fichier Serveur.java, dans la fonction run(), il s'agit de la ligne ois.close();

J'aimerais que vous m'expliquiez cette erreur car je ne comprends pas (et si le cœur vous en dit, m'expliquer pourquoi le reste ne marche pas ).


Merci d'avance pour votre aide.

2 réponses

rom117 Messages postés 9 Date d'inscription dimanche 19 octobre 2008 Statut Membre Dernière intervention 24 novembre 2009 7
24 nov. 2009 à 01:24
Et Client.java

/*

**** Chat multiclient - M1I 2008 *****

* Client.java

*

*/



// Packages à inclure

import java.net.*;

import java.io.*;





public class Client implements Runnable
{



// Déclaration des attributs de la classe



private int port ;

private String host;

private InetAddress inetAddress ;

Thread t ;

Socket s ;

String login ;



// Déclaration des méthodes



/** Constructeur de la classe Client */



public Client (/*int port*/) //throws IOException

{

//port=getPort();

//s = new Socket (host,port);

}





/** Méthode déclenchée après appel de 't.start()', son rôle consiste à lire et afficher les messages envoyés par le serveur*/

//Il s'agit principalement des messages envoyés par les autres utilisateurs (clients) */



public void run()
{

try
{

while(true)
{

// 1. Récupérer le flux d'entrée de la socket s (méthode getInputStream() de la classe Socket)

InputStream is = s.getInputStream ();

ObjectInputStream ois = new ObjectInputStream (is);

//obj = (Object) msg ;

// 2. Lire le message envoyé par le serveur (méthode bloquante, par exemple : readObject())

Object obj = ois.readObject();

// 3. Convertir l'objet ('Object') reçu en une chaine de caractères ('String')

String msg = (String) obj;

// 4. Afficher la chaine de caractères

System.out.println(msg);

}

}
catch(Exception e)

{

System.out.println(e);

}

}




/** Méthode permettant de lire une chaine de caractères depuis la ligne de commandes */

public String readMessage()throws IOException
{

String s="";

char c;

while ((c=(char)System.in.read())!='\n')

s=s+c;

return s;

}



/** Méthode permettant de se connecter au serveur, de lire les chaines de caractères depuis une ligne de commandes et de les envoyer au serveur. La chaine 'Bye' doit mettre fin à la connexion*/

public void launch()
{

try
{

String msg;

// 1. Créer la socket

System.out.println("Connexion au serveur...");

s = new Socket(getInetAddress(),getPort());



// 2. Lancer le Thread (méthode 'start') permettant de recevoir les réponses du serveur

t = new Thread(this);

t.start();

OutputStream os ;

ObjectOutputStream oos ;

os = s.getOutputStream();

oos = new ObjectOutputStream(os);

oos.writeObject(login);



// 3. Récupérer le flux de sortie de la socket (méthode getOutputStream() de la classe Socket)

do
{
//OutputStream os = s.getOutputStream();

//ObjectOutputStream oos = new ObjectOutputStream(os);

//String msg = "Message du Client";

msg=Lire.S();
System.out.println("Réception des messages en cours... \n");

//Object obj=(Object) msg;

// 4. Ecrire le message sur le flux de sortie de la socket (méthode writeObject());
oos.writeObject(msg);
}
// 5. Mettre fin à la connexion si le message envoyé est 'Bye'
while(!msg.equals("Bye"));
s.close();
System.out.println("Vous êtes deconnecté du serveur");



}


catch(IOException e)
{

System.out.println("Erreur de sérialisation "+e);

}

}



/** Méthode permettant d'introduire le numéro de port surveillé par le serveur */

public void setPort(int p)
{

if(p >0)

{

port=p;

}

}



/** Méthode permettant de retourner le numéro de port du serveur */

public int getPort()
{

return port;

}




/** Méthode permettant de retourner l'adresse IP du serveur */

public InetAddress getInetAddress()
{

return this.inetAddress;//this->pour une variable globale qui aurait le même nom que le paramètre (ici on peut ne pas le mettre)

}




/** Méthode permettant d'introduire le nom ou l'IP du serveur

* @throws UnknownHostException */

public void setInetAddress (String machineName/*InetAddress inetAddress*/) throws UnknownHostException
{

// 'if(inetAddress!='NULL')

// {

try

{

inetAddress=InetAddress.getByName(machineName);

}

catch(Exception e)

{



}

//inetAddress=InetAddress.getLocalHost(); //récupérer l'adresse IP de la machine

// }

}




/** Méthode permettant d'introduire le login de l'utilisateur */



public void getLogin() throws IOException {

System.out.print("Entrer votre login SVP : ");

this.login=readMessage();

}



public void setLogin(String _login){

this.login=_login;

}






//////////////////////////////////////////////////////////////////////////////////////////////

// Méthode principale : 'main'

//

// Le programme prendra 2 paramètres : une adresse ou un nom de serveur, un numéro de port.

//

//////////////////////////////////////////////////////////////////////////////////////////////



public static void main(String[] arg) throws UnknownHostException, IOException
{

Client em = new Client();

em.setInetAddress("localhost");

em.setPort(9999);

em.getLogin();

em.launch();

}




}
7
nickybutterfly
20 févr. 2010 à 14:54
Salut,

Je n'ai pas eu le courage de tout lire (l'indentation inexistante du code rend la lecture très lourde!!).
Mais d'après ce que j'ai pu lire, il faudra faire très attention à faire chaque fois une correspondance entre un OutputStream et un InputStream, dans cet ordre.
0