fengchao723
2012-01-04 17:17 浏览 203

为什么我使用niosocket写了一个客户端,不能正常返回。

我这个方法运行到-----测试下面的方法4----- 就不往下运行了,",这句"------------SocketClient成功返回-----
“没有打印出来。请大家帮我看看是什么问题。
public com.ksoft.util.TempObject run() {

try {

//打开Socket通道

SocketChannel client = SocketChannel.open();

//设置为非阻塞模式

client.configureBlocking(false);

//打开选择器

Selector selector = Selector.open();

//注册连接服务端socket动作

client.register(selector, SelectionKey.OP_CONNECT);

//连接

client.connect(ip);

//分配内存

ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);

int total = 0;

            while(selector.select() > 0) {   
                //selector.select();   
                Iterator iter = selector.selectedKeys().iterator();   

                while (iter.hasNext()) {   
                    SelectionKey key = (SelectionKey) iter.next();  
                    System.out.println("执行过的操作="+key.attachment());
                    iter.remove();   
                    if (key.isConnectable()) {   
                        SocketChannel channel = (SocketChannel) key   
                                .channel();   
                        if (channel.isConnectionPending())   
                            channel.finishConnect();   
                        channel.write(encoder.encode(CharBuffer.wrap(msg)));   
                        channel.register(selector, SelectionKey.OP_READ); 

                    }else if (key.isReadable()) {
                        Log.v( "sockettest", "进入读返回信息,使用对象");
                        SocketChannel channel = (SocketChannel) key   
                                .channel();   

                            channel.read(buffer);                               

                            buffer.flip();   

                                byte[] b = buffer.array();  
                                try {
                                    Log.v( "sockettest","------测试下面的方法---------");
                            to = byteToBject(b);
        Log.v( "取得结果了", "名字="+to.getName());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
              }
    Log.v( "sockettest","------------测试下面的方法2-----------");       
    buffer.clear();
    Log.v( "sockettest","------------测试下面的方法3-----------");
                    }

                } 

            }   
            Log.v( "sockettest","------------测试下面的方法4-----------");

        } catch (IOException e) {   
            e.printStackTrace();   
        }
        Log.v( "sockettest","------------SocketClient成功返回-----------");
        return to;   
    }   


public static com.ksoft.util.TempObject  byteToBject(byte[] bytes) throws IOException, ClassNotFoundException{

    com.ksoft.util.TempObject obj = new com.ksoft.util.TempObject();
    Object obj2 = new Object();
    Log.v( "sockettest","------------测试对象的使用-----------");
    ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
    ObjectInputStream objectinput = new ObjectInputStream(bi);
    obj = (com.ksoft.util.TempObject) objectinput.readObject();

    Log.v( "sockettest","------------测试对象的使用完成-----------");
    bi.close();
    objectinput.close();
    return obj;


}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答 默认 最新

  • 已采纳
    tianshilang tianshilang 2012-01-05 12:02

    selector.select()是阻塞的,It returns only after at least one channel is selected,这个方法返回的结果是选定的key数目,如有一个channel被选定的话返回值应该大于1,否则是一直在阻塞。log method在while之外,肯定执行不了啊

    用selector.select(timout)加一个timeout试试!

    点赞 评论 复制链接分享
  • u011606457 _1_1_7_ 2012-01-05 11:00

    还在 while(selector.select() > 0) 循环中执行,所以SocketClient成功返回----- 没有打印出来

    点赞 评论 复制链接分享
  • frederick850350 frederick850350 2012-01-05 17:12

    [i][list]
    [*][code="java"][/code][img][url][/url][table]
    ||
    [/table][b][/b][/img]
    [/list][/i][u][/u][quote][/quote][code="java"][/code][list]
    [*]
    [/list][align=left][/align]

    点赞 评论 复制链接分享

相关推荐