我正在写NIO的网络服务器。我有点完成了实现,但同时我对以下代码片段有一个疑问:
private void readDataFromSocket(SocketChannel socketChannel) throws IOException {
BUFFER.clear();
int count = 0;
while ((count = socketChannel.read(BUFFER)) > 0) {
BUFFER.flip();
int limit = BUFFER.limit();
while (limit > 0) {
System.out.print((char) BUFFER.get());
limit--;
}
System.out.println("");
}
if (count < 0) {
System.out.println("closing the socket!!!");
socketChannel.close();
}
}
我的假设是,如果客户端关闭套接字,那么read(socketChannel.read(BUFFER)
)将给我-1
。我的假设是否正确?
第二个问题: 假设客户寄给我:
发送:abcdef
发送:adnvjvnfkjnvkj
比发送“sfnskdlfnsdknfsdkj
”发生了一些网络错误。那么服务器会得到什么?
我的假设是服务器将获得:
abcdef
adnvjvnfkjnvkj
比服务器会出错。我是正确的还是服务器可能会获得一半数据sfnskdlfn
而不是错误?感谢。
答案 0 :(得分:1)
答案 1 :(得分:-1)
问题1:根据the SocketChannel documentation,您将收到ClosedChannelException。
问题2:您的服务器将缓冲数据直到错误发生,如果它发生在客户端写入的中间,那么它将包含一半的数据。这是假设在发送数据之前客户端没有缓冲,但最终没关系,你不应该依赖服务器获得“完整”或“无数据”,它可能会得到不完整的数据。