0

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

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() 错误。应该以何种方式实施。

4

1 回答 1

1

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

但是回显服务器中没有消息。因此,您的阅读和积累策略是不合适的。只需立即回显您收到的任何内容。

于 2013-10-29T22:31:06.993 回答