Java TCP IP连接 - 服务器上没有任何内容

时间:2017-03-10 19:06:20

标签: java tcp

我在服务器端使用此线程以便从客户端接收字符串:

int clientNumber = 0;
        ServerSocket listener = new ServerSocket(6543);
        try {
            while (true) {
                new Capitalizer(listener.accept(), clientNumber++).start();
            }
        } finally {
            listener.close();
        }
...

private static class Capitalizer extends Thread {

    private Socket socket;
    private int clientNumber;

    public Capitalizer(Socket socket, int clientNumber) {
        this.socket = socket;
        this.clientNumber = clientNumber;
    }

    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while (true) {
                String input = in.readLine();
                System.out.println("Am Server: " + input);
                out.println(input.toUpperCase());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

客户端看起来像这样:

try {
        Socket client = new Socket("localhost", 6543);
        OutputStream outToServer = client.getOutputStream();
        DataOutputStream out = new DataOutputStream(outToServer);

        final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.print("Enter something : ");
            String input = br.readLine();
            out.write(input.getBytes());
            out.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

我不清楚在服务器端没有收到字符串。 我在Eclipse控制台中输入一个字符串,在客户端将此字符串发送到服务器,但在服务器端没有任何反应。 有没有人暗示我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的服务器希望接收,因此您的客户端必须发送行。但是你的客户不发送线路。为什么呢?

来自docs

  

返回值
  包含行内容的String,不包括任何行终止字符;如果已到达流的末尾,则为null。

因此,readline的返回值一行,因为同一页说明:

  

一条线被视为由换行(' \ n'),回车(' \ r')或回车后的任何一个终止通过换行。

为避免将来出现此错误,在使用TCP之前,请准确指定 将准确发送和接收哪些信息。如果您正在使用TCP交换消息,则在字节级别定义精确消息是什么。

对于此应用程序,您应该精确指定消息将包含一系列字符,不包括任何行结尾符,其末尾标记为行结尾。这样就可以清楚地表明客户端是错误的,因为它显然没有按照协议的规定发送消息。