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

03-11-24 dream.master
我使用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用的人很少,没什么实质的进展,恳请板桥指点一下,最好给我一点有指导性的资料,非常感谢。

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

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

banq
2003-11-26 22:48
APU应为API

猜你喜欢