伪柏拉图 2012-01-04 17:17
浏览 211
已采纳

为什么我使用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 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试试!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器