2017-10-19 4 views
0

Nous devons implémenter un client Socket qui doit se connecter à un serveur qui accepte les connexions TCP. Si je communique via netcap avec le serveur, j'obtiens des réponses immédiates (via une ligne de commande).Java envoyer et recevoir plusieurs messages via Socket

Le workflow est:

nc 99.0.99.84 20000 

puis-je envoyer une demande de connexion au serveur

*99*0## 

je reçois la réponse ACK

*#*1## 

J'envoyer ma demande

*#18*802*86## 

je reçois la réponse au

*#18*802*86*222241400##*#*1## 

tout est très rapide via la ligne de commande.

Alors je tente de le faire avec un client Socket de cette façon

try { 

      Socket socket = new Socket("99.0.99.84", 20000); 

      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      System.out.println("Start"); 
      Thread.sleep(1000); 
      String connectionRequest ="*99*0##"; 
      System.out.println("Sending connection request " + connectionRequest); 
      out.println(connectionRequest); 
      String connResponse = in.readLine(); 

      System.out.println("Response to connection is " + connResponse); 
      Thread.sleep(500); 
      String payload ="*#18*802*86##"; 
      System.out.println("Sending " + payload); 
      out.println(payload); 
      String response = in.readLine(); 


      System.out.println("Response is " + response); 
      out.close(); 
      in.close(); 
      socket.close(); 

     } catch (UnknownHostException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
    } 

Lors de son utilisation, le client prend la réponse de connexion dans beaucoup de temps puis se ferme avec réponse = null

Sending connection request*99*0## 
Response to connection is *#*1##*#*1## 
Sending *#18*802*86## 
Response is null 

Y at-il un problème?

+0

La réponse se termine-t-elle par "\ r", "\ n" ou "\ r \ n'"? 'readLine' lira jusqu'à ce point et attendra jusqu'à ce qu'il l'obtienne. – icabod

+0

non ... il n'y a pas d'élément de fin de ligne ... – besmart

+0

grâce à votre commentaire j'ai résolu en utilisant un read() en lisant char par char – besmart

Répondre

1

Comme vous pouvez le voir ici: https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine()

readLine() retourne null si le flux a été mis fin avant d'atteindre une fin de l'alimentation ligne comme « \ n » ou « \ r ».

Tout comme dans votre cas, vous n'envoyez pas de lien EOL, puis vous fermez le flux, ce qui retourne le null.

Essayez d'ajouter '\ n' à la fin de votre message.

espérons que cela aide.

+0

Merci, le problème est que je ne peux pas changer la façon dont le serveur envoie ses messages .. – besmart

+1

Essayez de rincer l'écrivain avant de lire. out.flush() –