毛病比较多
if (keyChannel.isConnectionPending()) {
keyChannel.finishConnect();
}
Debug.logVerbose(" connected the server", module);
sendRequest(key);
这样做无论有没有连接成功都被当成连接上了,改为
if(keyChannel.finishConnect()) {
Debug.logVerbose(" connected the server", module);
key.interestOps(SelectionKey.OP_READ);
sendRequest(key);
}
else {
//处理连接失败
}一般没必要使用key.interestOps(SelectionKey.OP_WRITE);要发送数据的时候直接写就行了,如果一次没发完再key.interestOps(SelectionKey.OP_WRITE);在下一次事件中再发送,发送完了记得调用key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);否则cpu利用率会一直是100%,因为socketchannel总是可写的.selector.wakeup();在你这段代码中没有必要,在selector阻塞在select的时候才有必要.建议看看javaworld.com,onjava.com上关于nio的文章.
if (keyChannel.isConnectionPending()) {
keyChannel.finishConnect();
}
Debug.logVerbose(" connected the server", module);
sendRequest(key);
这样做无论有没有连接成功都被当成连接上了,改为
if(keyChannel.finishConnect()) {
Debug.logVerbose(" connected the server", module);
key.interestOps(SelectionKey.OP_READ);
sendRequest(key);
}
else {
//处理连接失败
}一般没必要使用key.interestOps(SelectionKey.OP_WRITE);要发送数据的时候直接写就行了,如果一次没发完再key.interestOps(SelectionKey.OP_WRITE);在下一次事件中再发送,发送完了记得调用key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);否则cpu利用率会一直是100%,因为socketchannel总是可写的.selector.wakeup();在你这段代码中没有必要,在selector阻塞在select的时候才有必要.建议看看javaworld.com,onjava.com上关于nio的文章.
解决方案 »
- 非得要用Myeclipse+Tomcat吗 用eclipse怎么配置
- 菜鸟认为很麻烦的问题:引用图片路径问题
- 请问:java怎么连接mssql analysis services服务器
- 数字验证!
- 求救!!
- Spring,Hibernate,EJB复习题
- Struts高手请帮忙!--几个 初级问题。
- 初学J2EE,问一下J2EE应用服务器JBoss、Tomcat之间的联系。
- 请 CoolAbu(阿卜-Never Stop(★★★★)) 来领分! 多谢指点~
- 关于UML图
- jb一运行,文件就消失
- Tomcat怎么把System.out.println("aaaaaaaaaaaaaaaaa");输出到日志文件里?
SocketChannel keyChannel = null;
try {
keyChannel =(SocketChannel)key.channel();
if (key.isConnectable())
{ //连接成功
if(keyChannel.finishConnect())
{
Debug.logVerbose(" connected the server", module);
key.interestOps(SelectionKey.OP_READ);
sendRequest(key);
}
else
{
Debug.logVerbose(" connection failed", module);
return;
}
}
else if (key.isReadable())
{
readResponse(key);
}
else if (key.isWritable())
{ sendRequest(key);
}
} catch (Exception e) {
Debug.logError("run error:" + e, module);
//socketHelper.close(key);
throw new Exception(e);
}
} private void sendRequest(SelectionKey key) {
try {
Message request=messageList.removeReqFirst();
String strs=(String)request.getObject();
Debug.logVerbose("send the request to the server="+strs,module);
//写入socket
socketHelper.writeSocket(strs.getBytes(),key);
key.interestOps(SelectionKey.OP_READ);
//selector.wakeup();
} catch (Exception ex) {
Debug.logError(ex, module);
}
} private void readResponse(SelectionKey key) {
try { byte[] array = socketHelper.readSocket(key);
if(array==null)
{
key.interestOps(SelectionKey.OP_READ);
//selector.wakeup();
return;
}
Debug.logVerbose("read the response from the server:"+new String(array),module); //key.interestOps(SelectionKey.OP_WRITE);
//selector.wakeup();
Debug.logVerbose("after wakeup");
} catch (Exception ex) {
Debug.logError(ex, module);
}
}
//selector.wakeup();
下加入sendRequest(SelectionKey key);就该就行了,你还是没完全按我说的做呢,呵呵
zzzhc大侠,能告诉我你的qq号么?真的急需你的帮助!!
也一直没有找到Debug那个包,应该是程序自带的吧,但没找到
好多问题啊……真头痛……
欢迎有空切磋 [email protected]