良好的连接建立

时间:2011-09-14 08:35:05

标签: java sockets

我知道当你需要在连接期间从服务器获取数据时,使用Scanner对象有一个很好的变体。但我对以下代码段有疑问:

public void sendMessage(String message) {
    try {
        OutputStream os = socket.getOutputStream();

        try {
            byte[] buffer;
            buffer = message.getBytes();
            os.write(buffer);
        } finally {
            os.close();
        }

        InputStream is = socket.getInputStream();

        try {
            StringBuffer data = new StringBuffer();
            Scanner in = new Scanner(is);
            while (in.hasNext()) {
                data.append(in.next());
            }
            System.out.println(data.toString());
        } finally {
            is.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我对ScannerInputStream获取数据的代码段感到困惑,因为它是在我向服务器发送消息后启动的。假设来自服务器的数据在向其发送消息后不会立即InputStream,这是否公平?

请给我一个建议,在这种情况下从InputStream阅读数据的最佳方法是什么?我应该考虑什么?

2 个答案:

答案 0 :(得分:1)

InputStream.read()调用的Scanner方法会阻塞,直到有一些数据可用。因此,您不必担心服务器的响应时间。

请参阅:http://download.oracle.com/javase/6/docs/api/java/net/Socket.html#getInputStream()

答案 1 :(得分:0)

代码无效。它所做的就是读取尽可能多的输入,无需阻塞即可读取。没有暗示已读取的内容是完整的消息,或者对应于发送方的单个write()调用等。如果您想要TCP / IP中的消息,则必须自己实现它们,并使用长度字前缀,自描述协议,如对象序列化或XML等等。