用SocketChannel.open()。socket()替换新的Socket()有什么问题吗?

如果我只是替换,会出现什么问题

socket = new Socket() 

 socket = SocketChannel.open().socket()? 

背景:我有一些使用new Socket()遗留代码,我希望能够中断socket.connect()调用。 我不想重写代码来使用NIO。 我了解到Thread.interrupt()不会中断socket.connect() ,但另一个线程上的socket.close()应该中断连接。 奇怪的是,这适用于Java 7但不适用于Java 6。

我莫名其妙地使用socket = SocketChannel().open().socket()会让我使用Thread.interrupt()来中断socket.connect() 。 它没有,但奇怪的是,它确实使Java 6中的socket.close()中断socket.connect()

请注意,我不是以任何方式直接使用附加的SocketChannel它出现在我创建Socket再也没有。

这会出什么问题?

有几个。

  1. 通过SocketChannel获取的Socket似乎不支持读取超时。
  2. 套接字的InputStream和OutputStream不是独立的:它们具有共同的互锁。

为什么要中断connect()调用? 当然你想要的只是连接超时?

抛出exception类型的差异可能会破坏现有代码。

例如,在Socket.getInputStream().read()阻塞时从不同的线程关闭Socket将导致替换后的AsynchronousCloseException ,而不是遗留代码可能期望的SocketException 。 ( AsynchronousCloseException不是SocketException的子类。)

但是,如果来自其他线程的关闭在read()之前进入,则Socket.getInputStream().read()仍将抛出SocketException