Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Achat - Vente Divers : gouki9711 et 22 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

connexion client /serveur avec socket

 
n°8742
guembasse
Profil : Jeune recrue
Posté le 08-06-2004 à 11:21:39  profilanswer
 

Bonjour,
Je développe une application client/serveur avec une communication via socket.
Voila mon client envoie des informations au serveur qui les traite et les renvoie au client ( tout ce qui est normal)
Mais lorsuq e que je souhaite renvoyer une autre information au serveur ce n'est pas possible car le flux d'entree du serveur est corrompu. J'ai essaye d'effectuer un flush sur le flux de sortie et un reset du flux d'entree mais ca ne fonctionne pas.Et si je ferme les flux d'entree et de sortie il me ferme également la socket et donc la connexion.  
 
Pouvez vous m'iader s'il vous plait??
Merci.

n°8774
ollone
Part of the 'One brothers
Profil : Vieux de la vieille
Posté le 08-06-2004 à 14:59:48  profilanswer
 

Essaies-tu de faire plusieurs échanges de données entre le client et le serveur à la suite, ou est-ce bien plus tard que ton client réintérroge ton serveur ?
 
Voici un exemple Thread écoutant les sockets clientes

Code :
  1. import java.net.*;
  2. import java.io.*;
  3. public class NetServerThread implements Runnable {
  4.   // Variables de classe.
  5.   private int counter = 0;
  6.   private int connectionPort;
  7.   private boolean listening = true;
  8.   private ServerSocket serverSocket;
  9.   private Socket connection;
  10.   private Socket clentSocket;
  11.   private ObjectOutputStream  output;
  12.   private ObjectInputStream  input;
  13.   private NetMessage messageObject;
  14.   private String message;
  15.   // =================================
  16.   // Constructeur du thread serveur.
  17.   // =================================
  18.   public NetServerThread(int port) {
  19.     this.connectionPort = port;
  20.     try {
  21.       serverSocket = new ServerSocket(connectionPort);
  22.       System.out.println("> SERVER : Le serveur attend les connections...\n" );
  23.     }
  24.     catch (IOException e) {
  25.       System.out.println("> SERVER : La socket serveur ne peut pas être lancée sur le port "+connectionPort+"." );
  26.       System.exit(-1);
  27.     }
  28.   }
  29.   // ===============================
  30.   // Execution initiale du Thread.
  31.   // ===============================
  32.   public void run() {
  33.     // Tant qu'on indique au thread de vivre.
  34.     while (listening) {
  35.       try {
  36.         // On accepte la socket cliente.
  37.         connection = serverSocket.accept();
  38.         // Si la connexion est établie.
  39.         if (connection.isBound()) {
  40.           ++counter;
  41.         }
  42.         // On crée maintenant les canaux d'entrée/sortie.
  43.         output=new ObjectOutputStream(connection.getOutputStream());
  44.         output.flush();
  45.         input=new ObjectInputStream(connection.getInputStream());
  46.         // On répond que la connection est établie.
  47.         sendData("SERVER >>> connection successfull" );
  48.         try {
  49.           // On récupère le contenu de la connexion (j'ai envoyé un objet ds ma socket).
  50.           messageObject = (NetMessage) input.readObject();
  51.           System.out.println("> SERVER : message recu = "+messageObject.getMessage());
  52.           // Ne fais pas attention à ca, c'est pour mon programme...
  53.           parent.chatTPane.addConvEntry(messageObject.convID, messageObject.sender, messageObject.messageStr);
  54.           // On ferme la connexion avec le client (ce qui aura pour effet de terminet la socket cliente, mais pas le "serveur" ).
  55.           sendData("TERMINATE" );
  56.         }
  57.         catch(ClassNotFoundException cnfex){
  58.           System.out.println("> SERVER : Le type de l'objet recu est inconnu!" );
  59.         }
  60.       }
  61.       catch (NotSerializableException e) {
  62.         System.out.println("> SERVER : la classe a envoyer n'est pas sérialisable!" );
  63.       }
  64.       catch (IOException e) {
  65.         System.out.println("> SERVER : l'acceptation de la socket cliente a échouée!" );
  66.       }
  67.     }
  68.     // On a décidé de ne plus écouter les appels client; le thread va se terminer.
  69.     try {
  70.       serverSocket.close();
  71.     }
  72.     catch (IOException e) {
  73.       System.out.println("> SERVER : la tentative de fermeture du thread serveur a échouée!" );
  74.     }
  75.   }
  76.   // ------------------------------------------------------------
  77.   // Méthode d'envoi d'un message à travers le canal de sortie.
  78.   // ------------------------------------------------------------
  79.   public void sendData(String s) {
  80.     try {
  81.       output.writeObject(new NetMessage("COMMAND", parent.localUserInfo, s));
  82.       output.flush();
  83.     }
  84.     catch(IOException cnfex) {
  85.       System.out.println("> SERVER : Une erreur est apparue lors de l'écriture de l'objet a envoyé." );
  86.     }
  87.   }
  88.   // ------------------------------------------------------
  89.   // Méthode permettant de mettre fin au thread d'écoute.
  90.   // ------------------------------------------------------
  91.   public void setListening(boolean state) {
  92.     listening = state;
  93.   }
  94.   // ----------------------------------------------------------
  95.   // Méthode d'affichage d'informations relatives au serveur.
  96.   // ----------------------------------------------------------
  97.   public void displayServerInfos() {
  98.     try {
  99.       NetworkInterface nwi = NetworkInterface.getByInetAddress(InetAddress.getByName(parent.localHost));
  100.       System.out.println("-------------------------------------------------" );
  101.       System.out.println("> Network interface : " + nwi.getDisplayName());
  102.       System.getProperties().list(System.out);
  103.       System.out.println("-------------------------------------------------\n" );
  104.     }
  105.     catch(IOException e) {}
  106.   }
  107. }


 
Si tu veux un exemple de code de socket cliente, fais-moi signe.

n°8853
guembasse
Profil : Jeune recrue
Posté le 08-06-2004 à 17:24:21  profilanswer
 

Ben en fait  j'essaie de faire les deux le serveur doit continuellement tourner et des qu'un client se connecte ler serveur traite les informations que ce client lui envoie et le client est capable d'effectuer plusieurs échanges de données avec le serveur.
Voila et merci beaucoup de ton aide

n°8854
ollone
Part of the 'One brothers
Profil : Vieux de la vieille
Posté le 08-06-2004 à 19:00:54  profilanswer
 

Côté client, utilises le même principe que la classe que je t'ai filée (il faut bien sur que ce soit un thread) :

Code :
  1. public void run() {
  2.   while (socketIsActive) {
  3.     [...]
  4.   }
  5. }


 
Ensuite, toujours côté client, sort de ta boucle while une fois que tu as tout traité.

n°8868
guembasse
Profil : Jeune recrue
Posté le 09-06-2004 à 11:55:20  profilanswer
 

Salut
J'ai réalisé donc un thread coté client afin que le client puisse réitérer une opération cela fonctionne mais lorsque j'effectue une deuxieme opération il me renvoie unee exception du type java.io.StreamCorruptedException alors qu'en initialisant à chaque fois le flux de sortie je fais un flush pour vider le flux mais ca ne marche pas  . Comment je peux faire?
 
Merci


Aller à :
Ajouter une réponse