2017-01-10 3 views
-1

J'ai fait un script pour échanger des données entre un client et un serveur avec socket sur un port spécifique. Pour, je me attends:Socket ne pas vidage des données

  • Server écoute

  • client ouvre un socket

  • akwnoledges Server en envoyant un int -> jamais reçu!

Je viens de remarquer que mon client reçoit l'int, quand je quitte le serveur brutalement

Voici mon code (simple). Client:

Socket socket = new Socket(SERVER_ADDR, PORT); 
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream()); 
DataInputStream dIn = new DataInputStream(socket.getInputStream()); 

Log.v("[DEBUG]", "waiting aknowledgement"); 
status = dIn.readInt(); //<-- BLOCKS HERE 
Log.v("[DEBUG]", "ack"); //<-- RECEIVED WHEN SERVER IS EXITED 

Serveur:

try { 

    DataInputStream stdIn = new DataInputStream(client.getInputStream()); 
    DataOutputStream stdOut = new DataOutputStream(client.getOutputStream()); 

    while (incoming) { 

     stdOut.writeInt(1); 
     stdOut.flush(); 

     System.out.println("Waiting..."); 
     var_from_client = stdIn.readInt(); //<-- BLOCKS HERE (BECAUSE CLIENT IS BLOCKED) 

     // ... 
    } 
} catch (Exception e) {} 

Comment expliquer cette erreur?

Répondre

0

'Socket pas rinçage des données' n'a absolument rien à voir avec cela. Ceci est un blocage , causé par un bogue dans votre application.

  1. Votre serveur envoie un int.
  2. Votre client reçoit l'int.
  3. Votre serveur bloque en essayant de lire un autre int.
  4. Votre client n'envoie pas d'int.
  5. Le serveur ne peut jamais envoyer un autre int car il est bloqué en attente de la réponse int inexistante.
  6. Votre client bloque en essayant de recevoir un autre int parce que le serveur est bloqué pour l'envoyer.

Solution: envoyez l'int du client.

Notes:

  1. Flushing le flux de sortie d'une prise ne fait rien et ne fait un rinçage DataOutputStream enroulé directement autour d'elle.
  2. JAMAIS ignore les exceptions.
+0

Veuillez consulter http://stackoverflow.com/questions/41685367/send-data-from-android-mobile-to-java-server?noredirect=1#comment70569691_41685367. Je n'ai pas ignoré l'exception, et j'ai envoyé correctement mes données. Cordialement – Anduriel