在下面的代码中读取没有thread.sleep()的Java socket输入流?

时间:2015-03-09 05:42:58

标签: java sockets telnet

public static void waitUntil(String prompt, InputStream instr) {
            while (true) {

                try {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (instr.available() >= 5) {
                        byte[] buff = new byte[1024];
                        int ret_read = 0;
                        ret_read = instr.read(buff);
                        if (ret_read > 0) {
                            if ((new String(buff, 0, ret_read)).contains(prompt)
                                    && flag) {
                                break;
                            }
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }      

如果删除thread.sleep(1000)或者甚至我将其减少到小于1000就不能正常工作。

问题:如何在没有thread.sleep()的情况下读取java套接字输入流,直到所有传入的字节到达为止?

2 个答案:

答案 0 :(得分:0)

if (instr.available() >= 5) {

不要这样做。

不是检查可用的字节数,而是尝试将一些字节读入缓冲区。

这将阻塞,直到至少有一个字节可用,然后返回尽可能多的字节(也适合缓冲区)。

如果没有返回你需要的所有字节,则循环直到你得到它们。

如果您只想阅读所有内容,请查看以下主题:Convert InputStream to byte array in Java。就个人而言,我使用Commons IO。

答案 1 :(得分:0)

使用缓冲区大小为5的DataInputStream.readFully()(在这种情况下,或更一般地说是您期望的数据大小),并且摆脱睡眠和available()测试。< / p>