尽管TCPClient发送整数,为什么TCPServer会收到一个字符串?

时间:2017-05-21 18:57:35

标签: java sockets tcp tcpclient tcpserver

我在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个盒装问号。不幸的是,我不知道如何更好地描述它们。 现在出现了一些问题:为什么我收到这个字符串?我希望程序能够顺利运行,没有例外,仅查看数字。 如果可能的话,这个字符串是什么?实际上是什么?
第三个相关问题:我如何顺利解决这个问题?

1 个答案:

答案 0 :(得分:4)

您使用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值。