SocketChannel 使用原理 最近写的程序里,与服务器通讯的地方,无法控制key.isReadable(),key.isWritable()的值!想知道SocketChannel 使用的原理!忙烦下各位朋友!谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【jianglihua1986】截止到2008-07-24 09:49:13的历史汇总数据(不包括此帖):发帖的总数量:0 发帖的总分数:0 每贴平均分数:0 回帖的总数量:0 得分贴总数量:0 回帖的得分率:0% 结贴的总数量:0 结贴的总分数:0 无满意结贴数:0 无满意结贴分:0 未结的帖子数:0 未结的总分数:0 结贴的百分比:---------------------结分的百分比:---------------------无满意结贴率:---------------------无满意结分率:---------------------如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html key好像是注册你要监听的事件的,注册时要指明监听的状态,就有accept read wirte之类的上面的函数应该就是判断这个的吧。 谢谢!"key好像是注册你要监听的事件的,注册时要指明监听的状态,就有accept read wirte之类的上面的函数应该就是判断这个的吧。"有点不太明白这句"注册时要指明监听的状态"能否有时间给解释下!谢谢!我的通讯方法是: public void talk() { //实力化 System.out.println("进入通讯状态了" + doWithConnect.getFlag()); if (doWithConnect.getFlag()) { selector = doWithConnect.getSelector(); socketChannel = doWithConnect.getSocketChannel(); try { socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); } catch (ClosedChannelException ex1) { ex1.printStackTrace(); } try { while (selector.select() > 0) { Set readyKeys = selector.selectedKeys(); Iterator it = readyKeys.iterator(); while (it.hasNext()) { key = null; try { key = (SelectionKey) it.next(); it.remove(); if (key.isReadable()) { receive(key); } if (key.isWritable()) { if (keepTable.getSendCommList().size() > 0) { send(key); if (k == 0) { timer.schedule(new MyTask(), 0, 5000); System.out.println("开始启动同步命令"); } k++; } else { return; } } } catch (IOException e) { e.printStackTrace(); try { if (key != null) { key.cancel(); key.channel().close(); } } catch (Exception ex) { ex.printStackTrace(); } return ; } } } } catch (IOException ex2) { ex2.printStackTrace(); } } else { return; } }希望能根据代码指明下!呵呵... a++ 与 ++a 区别 java多线程 java类型转换的问题 JTable的setCellEditor和setDefaultEditor有什么区别? 关于SWT/JFace的疑问(回帖就给分) 如何在Java rcp程启动时自动启动一个线程 【求助】反射问题 菜鸟求助!java读取内存卡中.EOL文件数据并画出波形~ 如何知道当前JVM所运行有那些class 请问:java内部类中包含接口的问题 SNMP4j-agent怎么从一个文件读入数据写入另一个另一文件,即不写入内存? [求助] 请详细比较下replace() 和 replaceAll() 吧, 真的很不理解。
楼主【jianglihua1986】截止到2008-07-24 09:49:13的历史汇总数据(不包括此帖):
发帖的总数量:0 发帖的总分数:0 每贴平均分数:0
回帖的总数量:0 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:0 结贴的总分数:0
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:---------------------结分的百分比:---------------------
无满意结贴率:---------------------无满意结分率:---------------------
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
"key好像是注册你要监听的事件的,注册时要指明监听的状态,就有accept read wirte之类的上面的函数应该就是判断这个的吧。"有点不太明白这句"注册时要指明监听的状态"能否有时间给解释下!谢谢!
我的通讯方法是:
public void talk() { //实力化
System.out.println("进入通讯状态了" + doWithConnect.getFlag());
if (doWithConnect.getFlag()) {
selector = doWithConnect.getSelector();
socketChannel = doWithConnect.getSocketChannel();
try {
socketChannel.register(selector,
SelectionKey.OP_READ |
SelectionKey.OP_WRITE);
} catch (ClosedChannelException ex1) {
ex1.printStackTrace();
}
try {
while (selector.select() > 0) {
Set readyKeys = selector.selectedKeys();
Iterator it = readyKeys.iterator();
while (it.hasNext()) {
key = null;
try {
key = (SelectionKey) it.next();
it.remove();
if (key.isReadable()) {
receive(key);
}
if (key.isWritable()) {
if (keepTable.getSendCommList().size() > 0) {
send(key);
if (k == 0) {
timer.schedule(new MyTask(), 0, 5000);
System.out.println("开始启动同步命令");
}
k++; } else {
return;
}
} } catch (IOException e) {
e.printStackTrace();
try {
if (key != null) {
key.cancel();
key.channel().close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return ;
} } }
} catch (IOException ex2) {
ex2.printStackTrace();
} } else {
return;
}
}
希望能根据代码指明下!呵呵...