最近遇到的网络编程方面需要注意的地方

   SocketChannel.connect()必须在SocketChannel.configureblocking之前执行,曾经在《java网络编程精解》(P117)上看到这么一段
  
   socketChannel.connect(isa);
   socketChannel.configureBlocking(false);
   

十分不以为然,按字面意思理解,当然应该先设置此通道的阻塞模式,然后进行连接,因此我在写代码时故意交换了这两句代码的顺序,结果。。。
  
   socketChannel.configureBlocking(false);
   socketChannel.connect(isa);
   

   java帮助文档里是这么记载的:
引用
configureBlocking
public final SelectableChannel configureBlocking(boolean block)throws IOException
调整此通道的阻塞模式。如果给定的阻塞模式与当前的阻塞模式不同,那么为了改变该模式,此方法调用 implConfigureBlocking 方法,同时保持适当的锁定。

connect
public abstract boolean connect(SocketAddress remote)throws IOException
连接此通道的套接字。如果此通道处于非阻塞模式,则调用此方法会发起一个非阻塞连接操作。如果立即建立连接(使用本地连接时就是如此),则此方法返回 true。否则此方法返回 false,并且必须在以后通过调用 finishConnect 方法来完成该连接操作。如果此通道处于阻塞模式,则在建立连接或发生 I/O 错误之前将阻塞此方法的调用。 此方法执行与 Socket 类完全相同的安全检查。也就是说,如果已安装了安全管理器,则此方法验证其 checkConnect 方法是否允许连接到给定远程端点的地址和端口号。可在任意时间调用此方法。如果正在调用此方法时在此通道上调用读取或写入操作,则在此调用完成前将首先阻塞该操作。如果试图发起连接但失败了,也就是说如果调用此方法抛出经过检查的异常,则关闭此通道。


   总结:具体原因尚未弄清,不过还是先连接,再调整阻塞方式吧!


你可能感兴趣的:(编程,socket)