伪柏拉图 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 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测