Socket Java - 客户端收到错误信息

Socket Java - Client receives a wrong information

我正在尝试通过 Socket 发送两个号码。服务器收到数字,我进行一些计算,但是当我将结果发回客户端时,客户端收到他发送的数字。

我哪里做错了因为我不明白?

Client.java

public class Client {
    private static Socket socket;
    public static void main(String args[]) {
        try {
            String host = "localhost";
            int port = 25010;
            InetAddress address = InetAddress.getByName(host);
            socket = new Socket(address, port);

            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            String number = "2";
            String number2 = "5";

            String sendMessage = number + "\n";
            String sendMessage2 = number2 + "\n";
            bw.write(sendMessage);
            bw.write(sendMessage2);
            bw.flush();
            System.out.println("Message sent to the server:\n" + sendMessage + sendMessage2);

            //Get the return message from the server
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String message = br.readLine();
            System.out.println("Message received from the server : " + message);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            //Closing the socket
            try {
                socket.close();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Server.java

public class Server {
    private static Socket socket;
    public static void main(String[] args) {
        try {
            int port = 25010;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port " + port);
            ArrayList<String> arr = new ArrayList<String>();

            //Server is running always. This is done using this while(true) loop
            while(true) {
                //Reading the message from the client
                socket = serverSocket.accept();
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));     // primeste mesaj de la client
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));   // transmite raspuns catre client
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                String inputLine;
                while ((inputLine = br.readLine()) != null) {
                    out.println(inputLine);
                    arr.add(inputLine.trim());
                }

                System.out.println("Message received from client is:");
                for (int i = 0; i < arr.size(); i++) {
                    System.out.println(arr.get(i));
                }

                //Return message
                String returnMessage = null;
                try {
                    int numberInIntFormat = 0;
                    int num = 1;
                    for (int i = 0; i < arr.size(); i++) {
                        System.out.println(arr.get(i));
                        numberInIntFormat = Integer.parseInt(arr.get(i));
                        num = num * numberInIntFormat;
                    }
                    arr.clear();
                    returnMessage = String.valueOf(num);
                } catch(NumberFormatException e) {
                    //Input was not a number. Sending proper message back to client.
                    returnMessage = "Please send a proper number\n";
                }

                //Sending the response back to the client.
                bw.write(returnMessage);
                bw.flush();
                System.out.println("returnMessage = " + returnMessage);
                System.out.println("Message sent to the client is "+ returnMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch(Exception e) {}
        }
    }
}

您的服务器代码会在对客户端执行任何其他操作之前将从客户端读取的所有内容回显给客户端:

    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));     // primeste mesaj de la client
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));   // transmite raspuns catre client
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

    String inputLine;
    while ((inputLine = br.readLine()) != null) {
        out.println(inputLine);    // <-- HERE
        arr.add(inputLine.trim());
    }

客户端收到服务器发送的内容并不奇怪。

String inputLine;
while ((inputLine = br.readLine()) != null) {
    arr.add(inputLine.trim());
}

进行此更改后,输出为:

服务器:

Server Started and listening to the port 25010

客户:

Message sent to the server:
2
5

现在服务器 'blocked' 处于 while 循环中,客户端没有收到任何反馈。

试试这个:

客户:

public class Client {
    private static Socket socket;
    public static void main(String args[]) {
        try {
            String host = "localhost";
            int port = 25010;
            InetAddress address = InetAddress.getByName(host);
            socket = new Socket(address, port);

            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            String number = "2";
            String number2 = "5";

            String sendMessage = number + "\n";
            String sendMessage2 = number2 + "\n";
            bw.write(sendMessage);
            bw.write(sendMessage2);
            bw.newLine();  // You need to send a special line for say to the server: "Hey, I have done";
            bw.flush();
            System.out.println("Message sent to the server:\n" + sendMessage + sendMessage2);

            //Get the return message from the server
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String message = br.readLine();
            System.out.println("Message received from the server : " + message);
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            //Closing the socket
            try {
                socket.close();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

服务器:

public class Server {
    private static Socket socket;
    public static void main(String[] args) {
        try {
            int port = 25010;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port " + port);
            ArrayList<String> arr = new ArrayList<String>();

            //Server is running always. This is done using this while(true) loop
            while(true) {
                //Reading the message from the client
                socket = serverSocket.accept();
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));     // primeste mesaj de la client
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));   // transmite raspuns catre client
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                String inputLine;
                while ((inputLine = br.readLine()) != null && inputLine.length() > 0) { // You need to stop loop when you get empty line
                   // out.println(inputLine);
                    arr.add(inputLine.trim());
                    System.out.println("Message received from client is:"+inputLine.trim());
                }

                System.out.println("Message received from client is:");

                //Return message
                String returnMessage = null;
                try {
                    int numberInIntFormat = 0;
                    int num = 1;
                    for (int i = 0; i < arr.size(); i++) {
                        System.out.println(arr.get(i));
                        numberInIntFormat = Integer.parseInt(arr.get(i));
                        num = num * numberInIntFormat;
                    }
                    arr.clear();
                    returnMessage = String.valueOf(num);
                } catch(NumberFormatException e) {
                    //Input was not a number. Sending proper message back to client.
                    returnMessage = "Please send a proper number\n";
                }

                //Sending the response back to the client.
                bw.write(returnMessage+"\n"); // You need to add '\n' otherwise readLine never gets;
                bw.flush();
                System.out.println("returnMessage = " + returnMessage);
                System.out.println("Message sent to the client is "+ returnMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch(Exception e) {}
        }
    }
}

我找到了更好的方法:

while (br.ready() && (inputLine = br.readLine()) != null)

如果要读取缓冲区,这会告诉它读取缓冲区。

根据@John Bollinger 的回复,缓冲区只读到第一个换行符,所以如果你试图解析一个包含换行符的字符串,当出现换行符时你会退出。

使用 br.ready() 它将解析所有字符串并在缓冲区末尾退出。