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

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

socketChannel.connect(isa);
socketChannel.configureBlocking(false);

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

socketChannel.configureBlocking(false);
socketChannel.connect(isa);

java帮助文档里是这么记载的:
[quote]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 方法是否允许连接到给定远程端点的地址和端口号。可在任意时间调用此方法。如果正在调用此方法时在此通道上调用读取或写入操作,则在此调用完成前将首先阻塞该操作。如果试图发起连接但失败了,也就是说如果调用此方法抛出经过检查的异常,则关闭此通道。 [/quote]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值