繁体   English   中英

InputStream接收方法阻塞

[英]InputStream receive method blocking

我陷入以下问题。 我已经创建了到远程回显服务器的连接。 以下方法用于接收从服务器接收的字节:

public byte[] receive() {       
    byte[] resultBuff = new byte[0];
    byte[] buff = new byte[4096];
    try {
        InputStream in = socket.getInputStream();

        int k = -1;

        while((k = in.read(buff, 0, buff.length)) != -1) {
            System.out.println(k);
            byte[] tbuff = new byte[resultBuff.length + k]; // temp buffer size = bytes already read + bytes last read
            System.arraycopy(resultBuff, 0, tbuff, 0, resultBuff.length); // copy previous bytes
            System.arraycopy(buff, 0, tbuff, resultBuff.length, k);  // copy current lot
            resultBuff = tbuff; // call the temp buffer as your result buff
            String test = new String(resultBuff);
            System.out.println(test);
        }
        System.out.println(resultBuff.length + " bytes read.");         

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return resultBuff;

}

我能够从服务器获得以下响应:

Connection to MSRG Echo server established

问题在于循环陷入了in.read()的第二次执行。 我了解这是由于服务器未发送任何EOF信息等。

我不确定以下两种解决方案中的哪一种是正确的,以及哪种实现方式是正确的:

  1. 来自服务器的每个消息都将由新执行的receive()方法读取。 如何防止in.read()方法阻塞?

  2. 在应用程序退出之前,receive()方法内部的循环应保持活动状态。 这意味着我的实现当前使用in.read()错误。 应该以哪种方式实施。

这个问题的关键是您使用“消息”一词。 TCP中没有消息,只有字节流。 如果需要消息,则必须自己实现:一次读取一个字节,直到获得完整的消息,进行处理,冲洗并重复。 您可以使用BufferedInputStream摊销单字节读取的成本。

但是回显服务器中没有消息。 因此,您的读取和累积策略不适当。 随便回声,无论收到什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM