2012-07-26 8 views
1

J'essaie de laisser un client (android) communiquer avec un serveur. Envoi de données client -> le serveur fonctionne correctement, mais je veux que le serveur réponde. code côté client est:Communication serveur Java-client socket

try { 
       Socket s = new Socket("192.168.0.36", 12390); 
       s.setSoTimeout(5000); 

       JSONObject json = new JSONObject(); 
       json.put("emergency", false); 
       json.put("imei", imei); 
       json.put("lat", l.getLatitude()); 
       json.put("lon", l.getLongitude()); 
       json.put("acc", l.getAccuracy()); 
       json.put("time", l.getTime()); 


       BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
       s.getOutputStream())); 
       out.write(json.toString()); 
       out.newLine(); 
       out.write("###"); 
       out.flush(); 
       Log.d(TAG, "sent"); 


       String inputLine = null; 
       String result = ""; 
       BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 

       Log.d(TAG, "open input"); 
       while ((inputLine = in.readLine()) != null) { 
        Log.d(TAG, "while"); 
        if (inputLine.contains("###")) { 
         break; 
        } 
        result = result.concat(inputLine); 

       } 

       Log.d(TAG, "closing socket"); 
       s.close(); 

côté serveur est:

Socket c = null; 
    while (true) { 
     try { 
      c = s.accept(); 
     } catch (IOException e) { 
      System.out.println("Accept failed: " + port); 
      System.exit(-1); 
     } 
     try { 

      BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream())); 
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(c.getOutputStream())); 



      String inputLine = null; 
      String result = ""; 
      while ((inputLine = in.readLine()) != null) { 

       if (inputLine.contains("###")) { 
        System.out.println("received ###"); 
         out.write("Hello phone"); 
         out.newLine(); 
         out.write("###"); 
         out.newLine(); 
         out.flush(); 

       } 

       result = result.concat(inputLine); 


      } 
      System.out.println(result); 

      out.close(); 

Le serveur lit le message du correctement client et après avoir reçu ### devrait envoyer un message, mais qui n'a jamais été reçu par le client. Le client expire

    while ((inputLine = in.readLine()) != null) { 
        Log.d(TAG, "while"); 
        if (inputLine.contains("###")) { 
         break; 
        } 

et n'entre jamais dans la boucle while. Qu'est-ce que j'oublie ici? Des idées appréciées!

Répondre

2

À partir du client:

out.write(json.toString()); 
out.newLine(); 
out.write("###"); 
out.flush(); 

Vous avez oublié d'ajouter une nouvelle ligne après l'envoi "###", parce que votre utilisation serveur readLine()

while ((inputLine = in.readLine()) != null) { 
//... 
} 

Alors, je crois que votre serveur peut Ne reçois pas ce message. Essayez de mettre

out.newLine(); 

après l'envoi de "###".

+0

C'était en fait ça! Je n'ai pas fait attention à lui parce que le serveur s'est connecté "System.out.println (" a reçu ### ");", mais celui-ci l'a résolu. Merci beaucoup! – FWeigl

0

Je peux me tromper ici, mais d'après mon expérience, j'ouvre toujours les flux d'entrée et de sortie avant de commencer les communications. Essayez de déplacer votre

BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 

juste à côté de

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 

juste au cas où vos paquets expirent avant d'ouvrir votre flux d'entrée et de commencer à les lire.

+0

Essayé, n'a pas aidé, mais merci pour votre contribution! – FWeigl