繁体   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