2017-05-21 3 views
0

私はTCPServerに整数を送るJavaでTCPClientを書いています。私は整数が送られないという事実をカバーするだけの健全性チェックを含んだが、何か他のものが含まれていた。整数を送信する場合、他の受信者が整数であると予想されます。TCPClientが整数を送信するにもかかわらず、TCPServerが文字列を受け取るのはなぜですか?

ただし、以下の次のコードでは、これはそうではないようです。

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++; 

    } 
    } 
} 

私が受け取る文字列常に8箱入り疑問符です。残念ながら、私はそれらをより良く表現する方法を知らない。 ここでいくつかの質問が発生します。なぜこの文字列を受け取るのですか?私はプログラムがスムーズに動作することを期待しています。 可能であれば、この文字列は何ですか?それは実際何ですか?
第3の関連する質問:どうすればスムーズに修正できますか?

答えて

4

java.io.DataOutputStreamを使用してintを書きますが、java.io.DataInputStreamを使用して読み取ることはできません。

実際には、文字入力ストリームからテキストを読み取るように設計されたjava.io.BufferedReaderを使用してください。そのため、データをString表現で受け取るのはこのためです。

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

によって:

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

およびint値を読み取るためにDataInputStream#readInt()方法を使用


を交換します。

関連する問題