簡體   English   中英

套接字Java-客戶端收到錯誤信息

[英]Socket Java - Client receives a wrong information

我正在嘗試通過套接字發送兩個數字。 服務器收到這些數字,然后我進行一些計算,但是當我將結果發送回客戶端時,客戶端會收到一個由他發送的數字。

因為不明白,我在哪里做錯了?

客戶端.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();
            }
        }
    }
}

服務器.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

現在,服務器在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的響應,緩沖區只能讀取到第一個換行符,因此,如果您嘗試解析包含換行符的String,則在出現換行符時會退出。

使用br.ready()它將解析所有String並將在緩沖區末尾退出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM