簡體   English   中英

Java套接字可以使客戶端無法讀取數據

[英]Java socket can client can not read the data

客戶端發送一條消息,然后服務器接收該消息並響應該消息。 我不知道為什么客戶端無法讀取響應。 如果我在客戶端中刪除讀取的部分,則服務器可以獲得消息。 但是對於以下代碼,沒有任何作用。 我也嘗試過flush() ,它仍然不起作用。

對於客戶

public void run() {

    try (Socket echoSocket = new Socket(HOSTNAME, Integer.parseInt(PORTNUMBER));
            DataOutputStream dOut = new DataOutputStream(echoSocket.getOutputStream());
            DataInputStream dIn = new DataInputStream(echoSocket.getInputStream());
    ) {

        while (true) {


            command = UI.commandQueue.take()
            dOut.writeInt(Message.toByteArray(command).length);
            dOut.write(Message.toByteArray(command));


            int length;
            while((length = dIn.readInt()) != 0) {
            if (length > 0){
                byte[] messagebyte = new byte[length];
                dIn.readFully(messagebyte, 0, messagebyte.length);
                try {
                    msg = Message.fromByteArray(messagebyte);
                    testDisplay(msg);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                testDisplay(msg);
            }
            }


        }

    }catch (UnknownHostException e) {
        UI.display("Don't know about host " + HOSTNAME);
    } catch (IOException e) {
        UI.display("Couldn't get I/O for the connection to " + HOSTNAME);
    }
}

對於服務器

public void run() {

    try (ServerSocket serverSocket = new ServerSocket(Integer.parseInt(PORT_NUMBER));
            Socket clientSocket = serverSocket.accept();

            DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream());
            DataInputStream dIn = new DataInputStream(clientSocket.getInputStream());) {
        int length;
        while ((length = dIn.readInt()) != 0) {
            if (length > 0) {
                byte[] messagebyte = new byte[length];
                dIn.readFully(messagebyte, 0, messagebyte.length); // read the
                                                                // message
                Message msg;
                try {
                    msg = Message.fromByteArray(messagebyte);
                    testDisplay(msg);
                    dOut.writeInt(Message.toByteArray(msg).length);
                    dOut.write(Message.toByteArray(msg));
                    UI.display("ack sent");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    UI.display(e.getMessage());
                }

            }
            }
    } catch (IOException e) {
        UI.display(
                "Exception caught when trying to listen on port " + PORT_NUMBER + " or listening for a connection");
        UI.display(e.getMessage());
    }

}

您的服務器在每個請求中回顯一個響應,但是您的客戶端試圖讀取每個請求中的多個響應,它將永遠不會得到響應,因此將其阻塞。

暫無
暫無

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

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