Ajouter un commentaire

Niroken

Hmmm

J'ai de mon coté fait le test suivant :

- Serveur sur un poste et client sur le même poste.
- Client sur un autre poste

Je n'ai eu aucun soucis.

Cependant, ton erreur "Connection timed out" me ferait davantage penser, à un firewall qui bloque l échange de données sur le réseau.

--------------------------------------------------------------------------------

Ensuite il est vrai que mettre les infos de connexions en dur dans le code, c'est moyen donc je te passe ceci :

C'est une classe utilitaire crée par moi :) qui permet de lire les fichiers de configuration (.properties) en java



import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class ConfigReader {
    
    private Properties mProperties;
    private static ConfigReader sInstance;
        
    private ConfigReader(String pFilePropertiesName) throws IOException {
        readConfig(pFilePropertiesName);
    }
    
    public static ConfigReader getInstance(String pFilePropertiesName) {
        if (sInstance == null) {
            try {
                sInstance = new  ConfigReader(pFilePropertiesName);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("Impossible de lire le fichier " + pFilePropertiesName);
            }
        }
        
        return sInstance;
    }
        
    private void readConfig(String pFilePropertiesName) throws IOException {
        mProperties = new Properties();
        FileInputStream vFileInputStream = new FileInputStream(pFilePropertiesName);
        mProperties.load(vFileInputStream);
        vFileInputStream.close();
    }

    public String getProperty(String pKey) {
        return mProperties.getProperty(pKey);
    }
    
    public Properties getProperties() {
        return mProperties;
    }
    
    public static String getClasspathResource(String pResourcePath) {
        String vPath = pResourcePath;
        
        if (vPath.startsWith("/")) {
            vPath = vPath.substring(1);
        }
        
        try {
            return Thread.currentThread().getContextClassLoader().getResource(vPath).getPath().replaceAll("%20", " ");
        } catch (Exception pException) {
            throw new RuntimeException("La ressource " + pResourcePath + " n est pas dans le classpath !");
        }
    }
    
}

Je te met ici la méthode à modifier coté client :

private void communicateWithServer() {
		Thread vThread = new Thread() {
	           
            public void run () {
                try {
                	int vPortServeur = Integer.parseInt(ConfigReader.getInstance("client.properties").getProperty("serveur.port"));
                	String vIpServeur = ConfigReader.getInstance("client.properties").getProperty("serveur.ip");
                	mClient = new Socket(vIpServeur, vPortServeur);
                    
                	if (authentificateWithServer(mClient)) {
                		while (true) {
                			displayClientsConnected(mClient);
                			
                			Thread.sleep(1000);
                		}
                	}
                	
                	mClient.close();
    			} catch (Exception e) {
                    e.printStackTrace(); 
                }               
            }
      
        };
        
        vThread.start();
	}

La méthode à modifier coté serveur :

public void launchServer() {
		mClients = new HashMap<String, Object>();
		
		try {
			int vPortServeur = Integer.parseInt(ConfigReader.getInstance("serveur.properties").getProperty("serveur.port"));
			ServerSocket vServerSocket = new ServerSocket(vPortServeur);
		    while(true) {
		        final Socket vSocket = vServerSocket.accept();
		        
		        Thread vThread = new Thread() {
		           private String mCurrentThreadNomClient;
		        	
		           public void run() {
		        	   try {
		        		   mCurrentThreadNomClient = receiveAuthentificationFromClient(vSocket);
		        		   
		        		   while (!vSocket.isClosed()) {
		        			   sendListClientsConnectedToClient(vSocket);
		        		   }
		        		   
		        		   vSocket.close();
		        	   } catch (Exception e) {
		        		   mClients.remove(mCurrentThreadNomClient);
		        		   e.printStackTrace();
		        	   }
		           }
		           
		       };
		        
		       vThread.start();
		    }
		} catch (Exception e) { 
			e.printStackTrace();
		}
	}	

Tu dois donc éditer un fichier de config pour le serveur que tu mettras dans le répertoire ou s executes ton serveur "serveur.properties"

serveur.port=3500

De même pour le fichier de config client "client.properties"

serveur.port=3500
serveur.ip=localhost

C'est plus propre comme ca tu peux modifier la config, sans changer le code.

Pour en finir je vais répondre à ta dernière question : la HashMap

En fait il s'agit d'une structure de données indéxée : ici c'est par nom de client.

Structure de données, oui, mais quelle données??, ici cette HashMap va contenir la liste des messages en attente pour chaque client.

J'avais préparé le terrain pour l'étape 2 :

- Toutes les 1s le client envoit une requete au serveur, dans cette requete on va également envoyer ce que le client a saisi.
- Le serveur va recevoir cette requete et va ajouter le ou les messages du client aux listes de messages en attente de tous les autres clients.
- Puis le serveur renvoit au client sa liste des messages en attente.

La dans le scénario que je viens de décrire, a chaque fois qu un client ecrira un message, il sera vu par tous les autres clients.
Mais si tu veux ecrire un "private message" visible que par un seul client, le serveur ajoutera le message du client seuelement au client destinataire concerné.

L'interet de la HashMap c'est que comme c'est indéxée par nom de client, si tu veux atteindre la liste des messages dun client donné : tu fais :

vHashMap.get("nomDeClient");

Où vHashMap est une instance de HashMap.

Je te passe la partie pour le tchat dem1, faut quand même le temp de la coder :)

Bonne chance,
Niroken

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 ZZZZZ  DDD   H  H  X   X  TTTTTT 
Z D D H H X X TT
Z D D HHHH X TT
Z D D H H X X TT
ZZZZZ DDD H H X X TT