IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres Java Discussion :

Problème de ServerSocket sur le logiciel client


Sujet :

Autres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Par défaut Problème de ServerSocket sur le logiciel client
    Bonjours à tous !

    Je travaille actuellement sur un logiciel de contrôle de serveurs de jeu à distance.
    Pour cela j'ai créé un logiciel serveur sur un VPS que j'ai loué, le même que celui sur lequel j'héberge mes serveurs de jeu.
    Du coté client j'ai un panel qui me permet de contrôler tout ça à distance, jusque là pas de problèmes.

    J'ai eu l'idée de rajouter un chat console permettant aux utilisateurs du logiciel de pouvoir parler en temps réel. Pour cela j'ai un second programme .jar qui s'ouvre dans la console.
    Je commence par me connecter au serveur pour lui signifier que je me connectes au chat.
    Ensuite je récupère les utilisateurs connectés pour les afficher.
    (Ensuite je lance le Thread du ServerSocket, voir lui bas)
    Enfin grâce à un Scanner(System.in) je récupère le prochain message du joueur et je l'envoi une fois saisit.

    Jusque là pas de problèmes.

    Pour permettre au chat client de récupérer les messages envoyé par les autres utilisateurs, je n'ai pas trouvé d'autres moyens que de créer un ServerSocket auquel le serveur va envoyer les messages.
    Donc j'envoi lors de ma connexion au chat (coté client) mon adresse ip locale grace à InetAddress.

    Le problème est que du coté serveur je récupère cette erreur lors de la tentative de connexion :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    java.net.ConnectException: Connexion terminée par expiration du délai d'attente (Connection timed out)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:244)
    at main.Chat.run(Chat.java:27)
    Code du chat client lors de la création du ServerSocket qui reçoit les messages des autres utilisateurs :
    (C'est un Thread)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    		try {
     
    			s = new ServerSocket(51169);
    			System.out.println(s.getInetAddress().getHostAddress());
    			System.out.println(InetAddress.getLocalHost().getHostAddress());
     
    			while(Chat.truelogs && Chat.continu) {
     
    				Socket ss = s.accept();
     
    				in = new BufferedReader(new InputStreamReader(ss.getInputStream()));
     
    				String msg = in.readLine();
    				System.out.println(msg);
     
    				in.close();
    				ss.close();
     
    			}
     
    			s.close();
     
    		} catch (Exception e) {e.printStackTrace();}
    Voici le code du coté serveur lors de l'envoi d'un message :
    (C'est un Thread)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
                    try {
     
    			for (String u : Main.luc) {    // luc est une ArrayList<String> contenant les utilisateurs 
                                                                     // connectés au chat
     
    				s = new Socket(Main.lui.get(u), 51169);   // lui est une HashMap<String, String>
                                                                     // contenant <utilisateur, ip> pour l'envoi des messages
                                       //  ^    C'est également la ligne mise en cause dans l'erreur donné par le
                                       //  ||       serveur "at main.Chat.run(Chat.java:27)"
     
    				out = new PrintWriter(s.getOutputStream());
     
    				out.println(m);
    				out.flush();
     
    				out.close();
    				s.close();
     
    			}
     
    		} catch (Exception e) { e.printStackTrace();}
    Voilà j'espère que je vous ai donné toutes les informations nécessaires, je vous remercie d'avoir pris le temps de lire mon post, cordialement drakonic59.

    PS : Peut-être un problème d'ouverture de ports ?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    J'ai cru mal comprendre : un client quelconque devient serveur pour tous les clients avec lesquels il souhaite discuter ? Donc le client envoie ses coordonnées au serveur et le serveur devient client du client et le client devient serveur du serveur ? Le serveur se charge d'envoyer les coordonnées du client (devenu serveur) à tous les autres clients prenant part à la conversation ?
    Est-ce une contrainte ?
    Pourquoi ne pas faire une nouvelle socket serveur sur le serveur, dédiée à la conversation, et le client s'y connecte en créant un channel, un "id" de groupe. Lorsque le client envoie un message, il donne aussi son "id" de channel.
    Le serveur possède une cartographie des associations "id" <=> groupe de client et route tous les messages aux clients concernés par ce channel.
    Avec cette technique, le serveur reste serveur, le client reste client.

    Selon le protocole, tu pourrais même placer les messages de conversation dans les sockets déjà ouvertes entre client/serveur. Mais tout dépend de ce qui transite déjà, si ton protocole de communication est facilement extensible, contrainte technique, blabla...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Par défaut
    Salut et déjà merci d'avoir répondu !

    Alors en fait le Client reste Client et le Serveur reste Serveur, ou presque :
    Depuis le client et lors de la connexion j'envoi le nom d'utilisateur, le mot de passe, et l'adresse ip locale de la machine.
    Le serveur va stocker ces informations.

    Lorsque une personne envoi un message, le client envoi le dit message au serveur. Suite à quoi le serveur tente de se connecter au ServerSocket de chaque client connecté au chat (grâce à l'ip stockée) pour leur envoyer le message.

    Le serveur n'est là que pour transmettre l'informations aux autres clients, c'est un peu comme un intermédiaire.

    Concernant l'idée que tu me proposes, lorsque tu dis que le serveur envoi le message à chaque personne connecté au même channel, je ne vois pas comment faire cela sans utiliser un ServerSocket du coté client.
    Cela car lorsque j'ai fais mes petits tests, je me suis aperçus que in.readLine() n'attendait pas qu'il y ai quelque chose à lire. Si il n'y a rien il essai de lire quand même.
    Ainsi si je laisse un Socket ouvert entre le serveur et le client pour les messages, il me faudrait un moyen d'attendre et de détecter qu'un message est prêt à être lu dans le flux.

    Si tu as une idée pour cela, ou une manière de faire je suis preneur !

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Les clients sont-ils toujours connectés au serveur ?
    Quel genre de messages transitent entre les clients et le serveur ? Est-ce un protocole à toi ? Ou quelque chose que tu ne maitrises pas en utilisant une API par exemple ?
    Dans les 2 cas, le client doit se connecter au serveur, pas l'inverse. La connexion est déjà établie et fonctionnelle dans un sens. L'autre sens (serveur vers client) n'est pas garantie à cause des firewall et autres équipements réseaux.

    Pour savoir si des données sont disponibles en lecture, il y a la méthode "Socket.getInputStream.available".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Par défaut
    Alors rebonjour !

    Effectivement c'est un protocole que j'ai développé, je le maîtrises totalement.
    Les informations qui transites entre le client et le serveur sont des commandes du type "chat", "getusers" ..
    Les commandes sont reçus par le serveur et exec sur les serveurs de jeu avec des fichier.sh.
    En temps normal il n'y a aucunes autres informations qui transitent, sauf parfois des listes de String pour les noms utilisateurs.

    Cela dit je penses que tu as raison, je vais utiliser des Sockets déjà ouverts et ne pas utiliser de SocketServer sur le client.

    Je vais passer le post en Résolu

    Merci pour tes réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. RMI problème du Main sur la classe Client
    Par baresi dans le forum Java EE
    Réponses: 0
    Dernier message: 23/04/2013, 00h07
  2. Réponses: 3
    Dernier message: 11/12/2009, 18h33
  3. Réponses: 2
    Dernier message: 22/10/2009, 18h44
  4. Problème validation seulement sur un poste client
    Par ninostop dans le forum Struts 2
    Réponses: 0
    Dernier message: 23/01/2009, 15h57
  5. [ServerSocket] Problème de bloquage sur readLine()
    Par thomaswilliamson dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 15/03/2005, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo