Java Aio 网络编程出现的WritePendingException原因及解决办法
出现这个异常的原因是:
1.如果一个读写操作没有完成,程序又发送一个读写操作命令,则导致ReadPendingException或者WritePendingException,
也就是说出现这个异常的原因是上一个读写没有结束
解决办法:找到上一部分的读写操作,在buffer缓冲区的读写操作结束后调用flip()方法改变一下读写模式。
以下是部分代码帮助理解
public void completed(Integer result, Object attachment) {
ByteBuffer byteBuffer = (ByteBuffer) attachment;
if (byteBuffer != null) { // 如果发生了读事件
if (result <= 0) {
// 客户端通道发生了异常
// 将客户从在线客户列表中去除
removeClient(this);
} else {
byteBuffer.flip(); //转换为读操作
String fwdMsg = receive(byteBuffer); //读取buffer里的消息
byteBuffer.flip();//转换为写操作
try {
CommandControl(fwdMsg);
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(getClientName(clientChannel) + ":" + fwdMsg);
forwardMessage(clientChannel, fwdMsg); //向其他用户转发消息
byteBuffer.clear();//清除缓冲区
// 检查用户是否退出
if (readyToQuit(fwdMsg)) {
// 将客户从在线客户列表中去除
removeClient(this);
} else {
clientChannel.read(byteBuffer, byteBuffer, this);
}
}
}
}