请教板桥大哥一个关于Nio的两个问题

我使用Nio来进行Socket通信,
客户端如下发请求:
String request = “......”;
keyChannel.write(encoder.encode(
CharBuffer.wrap(request)));
keyChannel.close();
如果我不输入keyChannel.close(),server端在读的时候会出现一个异常“java.io.Excetption:远程主机强制关闭了一个连接”,如果是单项通讯,我可以关闭,但是现在我的Server端必须向client发送响应包,是不是会有问题?

还有一个问题,在Server端
ServerSocket serverSocket = channel.socket();
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
byte[] b = new byte[1024];
in.read(b);
System.out.println(new String(b,0,b.length));
这样我可以读到request的内容,但是如下
SocketChannel s = channel.accept();
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
buffer.flip();
int ok = 0;
while (ok != -1)
{
ok = s.read(buffer);
}
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(buffer);
String result = charBuffer.toString();
却总是出项空指针异常,不知道为什么。

可能我的问题比较简单,实在不好意思,我也是查了一些资料,不过现在Nio用的人很少,没什么实质的进展,恳请板桥指点一下,最好给我一点有指导性的资料,非常感谢。

NIO的read原理与原来不一样,直接将内容字节读入ByteBuffer中的,因此可能你的read写法不正确导致。

关于NIO内容,可见我最近将出版的“Java实用系统开发指南”,其中有完整的NIO底层读写代码,且经过性能并发测试,可以作为APU直接使用到自己的系统中。

APU应为API