2009-06-22 4 views
0

je l'application cliente socket Java suivante, qui envoie même chaîne à la prise serveur:serveur ne reçoit pas octets écrits à une prise par application Java

import java.net.*; 
import java.io.*; 

public class ServerClient { 
public static void main(String[] args) throws IOException { 
    System.out.println("Starting a socket server client..."); 
    Socket client = new Socket("XXX.X.XXX.XX", 12001); 
    BufferedOutputStream stream = new BufferedOutputStream(client.getOutputStream()); 
    String message = "ABC"; 

    BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));  
    String input = null; 
    while (true) { 
     System.out.print("Would you like to send a message to Server? "); 
     input = inputReader.readLine(); 
     if (!input.equals("Y")) break;  

     System.out.println("Message to send: " + message); 
     System.out.println("Message length is: " + message.length()); 

     byte[] messageBytes = message.getBytes("US-ASCII"); 
     stream.write(messageBytes, 0, messageBytes.length); 
     stream.flush(); 
    } 
    System.out.println("Shutting down socket server client...");   
    stream.close(); 
    client.close(); 
    inputReader.close(); 
} 
} 

Le premier message de temps est envoyé, le serveur reçoit le message; Cependant, chaque fois que j'essaie d'envoyer ce message, le serveur ne reçoit rien. Le message disparaît simplement. J'écris avec succès sur le socket (pas d'exception) mais rien ne vient de l'autre côté du tuyau (ou du moins c'est ce que l'on me dit). Je n'ai pas accès à l'application, aux journaux ou au code du serveur. Je me demande donc s'il existe une approche que vous pouvez recommander pour déterminer pourquoi le serveur ne reçoit pas les messages suivants. Toutes les idées seraient grandement appréciées!

Précision:

  1. nouvelles lignes ne sont pas attendues par le serveur; Sinon, comment recevrait-il même un message la première fois? Comme essai et erreur, j'ai essayé d'envoyer '\ n' et "\ r \ n" et les caractères 0x00 à la fin de la chaîne - le tout sans aucune chance. Je pensais que le flush était un problème, j'ai donc essayé différentes classes de sortiestream (PrintStream, PrintWriter, FilterOutputStream), mais je rencontrais toujours les mêmes problèmes. Alors, si le "flush" est un problème, comment ça marche la première fois?

Répondre

1

Autres essais:

1 - utiliser un renifleur de réseau pour voir ce qui est hapening sur le réseau realy

2 - utiliser certains programmes comme TCP Test Tool pour envoyer des données au serveur et simuler votre programme. (netcat peut également être utilisé, mais il envoie un retour à la ligne après chaque ligne)

+0

Essayé en utilisant TCP Test Tool et obtenir le même résultat. On dirait que le problème est avec le côté serveur, pas avec le flux java ou le flush. Essayer de savoir si je suis autorisé à exécuter Network Analyzer. Got Wireshark à ces fins. –

0

Il fonctionne correctement ici ... mais je manque un retour chariot ou un autre la fin du message après l'envoi du message.
Difficile à écrire plus sans savoir ce que le serveur espects (protocole) ... Peut-être que vous devriez essayer quelque chose comme

String message = "ABC\n"; 
+0

d'après ce que je comprends le serveur devrait être en train de lire ce qui arrive à la pipe. Il ne s'attend pas à des retours de chariot (comme démontré quand j'envoie un message la première fois) –

+0

peut-être que vous devriez donner plus de détails sur le serveur. J'ai testé votre code en utilisant NC (netcat) comme serveur: chaque fois que je tape Y suivi de ENTER sur la console pour votre code, j'obtiens un "ABC" supplémentaire à la fin du serveur. –

1

Rappelez-vous:

  • TCP est orienté flux. pas orienté message.
  • Une écriture sur le client pourrait prendre plusieurs lit sur le serveur .. Lire la
  • écrit plusieurs sur le client pourrait se lire par le serveur dans un
  • lire
  • Vous aurez du mal à voir les scénarios ci-dessus dans un test application sur un réseau local, vous les verrez très rapidement dans un environnement de production, ou lorsque vous commencez vraiment à accélérer l'envoi/réception.

Par la suite, si vous envoyez des messages vous avez besoin d'un séparateur ou d'une autre façon d'indiquer « est ici un message », par exemple définir le protocole comme étant 'le premier octet est la longueur du message suivant'. Et vous auriez besoin de vérifier l'extrémité de réception si elle a lu un message partiel, un message entier et toute combinaison de ceux-ci (par exemple, une lecture peut avoir lu 3 messages et demi ..).

Une solution rapide pour votre application de test, écrire des lignes. C'est-à-dire, une chaîne suivie d'un caractère de retour à la ligne. ReadLine() d'un lecteur buffered peut alors s'occuper du réassemblage pour vous à la réception.

+0

Quelle est ma question: si nous vidons un tableau d'octets dans un flux, ils devraient au moins "apparaître" à l'autre extrémité. Vous vous souciez du délimiteur au moment où votre logique métier commence à les traiter –

+0

Vous avez raison. Mais vous ne montrez pas le code du serveur qui fait la lecture. Il est donc difficile de savoir s'il fait la bonne chose. par exemple. Appelle-t-il en lecture seulement une fois? Ou fait-il une boucle jusqu'à ce que le courant soit fermé? – nos

Questions connexes