最近在搞非阻塞通信,当在client端用SocketChannel 进行 阻塞 connect 时,如果参数输入错误,比如服务器路径、端口不对,那么connect 函数一直阻塞!看文档说是在阻塞时,会出先IOException 异常,但是我却等不到这个异常。
请问有哪位大侠懂的这是怎么回事吗?在网上所遇到的SocketChannel问题都是非阻塞的问题,始终找不到一个阻塞的connect的问题!SocketChannel 里的 connect 有没有像 Socket 里的setSoTime 这样的函数呢?

解决方案 »

  1.   

    如果立即建立连接(使用本地连接时就是如此),则此方法返回 true。否则此方法返回 false,并且必须在以后通过调用 finishConnect 方法来完成该连接操作你看看connect返回的是什么值,要是false还要用finishConnect
      

  2.   

    SocketChannel 与一个 Socket 关联的。通过 SocketChannel#socket() 方法可以获这个关联的 Socket,你可以这上面设置 setSoTime。如果没有抛出异常,那很有可能是碰巧连上了一个可用的。
      

  3.   


    这样啊!那我SocketChannel sock1;sock1.connect()是不是相当于sock1.socket().connect()呢?
      

  4.   

    SocketChannel#socket() 得到的 Socket 与 java.net.Socket 不是同一种东西。前者得到的虽说得到的是一个 Socket ,但它是 java.net.Socket 的子类 sun.nio.ch.SocketAdaptorSocketChannel#connect 与 SocketChannel#socket()#connect(),后者会调用前者的 connect。具体的参见下面两个类的源代码:sun.nio.ch.SocketChannelImpl
    sun.nio.ch.SocketAdaptor