Почему TCPServer получает строку, хотя TCPClient отправляет целые числа?

Я написал TCPClient на Java, который отправляет целые числа на 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 вопросительных знаков в рамке. К сожалению, я не знаю, как лучше их описать. Теперь возникает несколько вопросов: Почему я получаю эту строку? Я ожидаю, что программа будет работать гладко, без каких-либо исключений, видя только числа. Если можно, что это за строка? Что это на самом деле?
Третий связанный с этим вопрос: как я могу плавно исправить это?


person blauerschluessel    schedule 21.05.2017    source источник


Ответы (1)


Вы используете java.io.DataOutputStream для записи int, но не используете java.io.DataInputStream для их чтения.

Вы действительно используете java.io.BufferedReader, предназначенный для чтения текста из потока ввода символов. Вот почему вы получаете данные в строковом представлении.

Заменять :

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

by :

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

и используйте метод DataInputStream#readInt() для чтения int значений.

person davidxxx    schedule 21.05.2017