最近写的程序里,与服务器通讯的地方,无法控制key.isReadable(),key.isWritable()的值!想知道SocketChannel 使用的原理!忙烦下各位朋友!谢谢

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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
      

  2.   

    key好像是注册你要监听的事件的,注册时要指明监听的状态,就有accept read wirte之类的上面的函数应该就是判断这个的吧。
      

  3.   

    谢谢!
    "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;
            }
        }
    希望能根据代码指明下!呵呵...