2017-05-21 2 views
0

정수를 TCPServer로 보내는 TCPClient를 Java로 작성했습니다. 나는 정수가 전송되지는 않지만 다른 어떤 경우를 다루기 위해 온전한 검사를 포함했다. 정수를 전송하면 다른 수신기가 정수가 될 것으로 예상됩니다. 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 박스 물음표입니다. 불행히도 나는 그들을 더 잘 묘사하는 방법을 모른다. 이제 몇 가지 질문이 생깁니다.이 문자열을받는 이유는 무엇입니까? 나는 예외없이 프로그램이 원활하게 돌아가고 숫자 만 보길 기대한다. 가능하면이 문자열이 무엇입니까? 실제로 무엇입니까?
세 번째 관련된 질문 : 어떻게하면 원활하게 해결할 수 있습니까?

답변

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() 방법을 사용


바꾸기.

관련 문제