2017-05-21 3 views
0

J'ai écrit un TCPClient en Java qui envoie des entiers à un serveur TCPS. J'ai inclus un contrôle de santé mentale juste pour couvrir le cas que les entiers ne sont pas envoyés, mais quelque chose d'autre. Si on envoie des entiers, alors on s'attendrait à ce que les autres récepteurs soient entiers.Pourquoi le TCPServer reçoit-il une chaîne, bien que TCPClient envoie des entiers?

Cependant, dans le code suivant ci-dessous, cela ne semble pas être le cas:

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 

class TCPClient { 
    public static void main(String argv[]) throws Exception { 

    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 

    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    int c = 0; 
    while (c < 1000000) { 
     System.out.println("Sent: " + c); 
     outToServer.write(c); 
     // Thread.sleep(1000); 
     c++; 

    } 
    clientSocket.close(); 
    } 
} 



import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

class TCPServer { 
    public static void main(String argv[]) throws Exception { 

    String reg = "\\d+"; 
    int c = 0; 
    ServerSocket welcomeSocket = new ServerSocket(6789); 

    Socket connectionSocket = welcomeSocket.accept(); 
    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 

    while (true) { 
     String s = inFromClient.readLine(); 

     if (s.matches(reg) == false) { 
     throw new Exception(s + "is an invalid input! Expected one String of digits."); 
     } 

     int n = Integer.parseInt(s); 
     if (c + 1 != n) { 
     throw new Exception("Expected: " + (c + 1) + ", but got: " + n); 
     } 
     System.out.println("Received: " + c); 
     c++; 

    } 
    } 
} 

La chaîne que je reçois sont toujours 8 points d'interrogation en boîte. Malheureusement, je ne sais pas comment les décrire mieux. Maintenant, quelques questions se posent: Pourquoi est-ce que je reçois cette chaîne? Je m'attendrais à ce que le programme se déroule bien, sans exception, en voyant seulement des chiffres. Si possible, quelle est cette chaîne? Qu'est-ce que c'est réellement?
Troisième question connexe: Comment puis-je résoudre ce problème en douceur?

Répondre

4

Vous utilisez un java.io.DataOutputStream pour écrire le int s mais vous n'utilisez pas un java.io.DataInputStream pour les lire.

Vous utilisez en effet un java.io.BufferedReader qui est conçu pour lire le texte à partir d'un flux d'entrée de caractères. C'est pourquoi vous recevez des données dans une représentation String.

Remplacer:

BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 

par:

DataInputStream outToServer = new DataInputStream (connectionSocket.getInputStream()); 

et utiliser la méthode DataInputStream#readInt() pour lire int valeurs.