为什么我使用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个回答

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

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

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

[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]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问