我知道当你需要在连接期间从服务器获取数据时,使用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();
}
}
我对Scanner
从InputStream
获取数据的代码段感到困惑,因为它是在我向服务器发送消息后启动的。假设来自服务器的数据在向其发送消息后不会立即InputStream
,这是否公平?
请给我一个建议,在这种情况下从InputStream
阅读数据的最佳方法是什么?我应该考虑什么?
答案 0 :(得分:1)
InputStream.read()
调用的Scanner
方法会阻塞,直到有一些数据可用。因此,您不必担心服务器的响应时间。
请参阅:http://download.oracle.com/javase/6/docs/api/java/net/Socket.html#getInputStream()
答案 1 :(得分:0)
代码无效。它所做的就是读取尽可能多的输入,无需阻塞即可读取。没有暗示已读取的内容是完整的消息,或者对应于发送方的单个write()调用等。如果您想要TCP / IP中的消息,则必须自己实现它们,并使用长度字前缀,自描述协议,如对象序列化或XML等等。