用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
再也没有。
这会出什么问题?
有几个。
- 通过SocketChannel获取的Socket似乎不支持读取超时。
- 套接字的InputStream和OutputStream不是独立的:它们具有共同的互锁。
为什么要中断connect()调用? 当然你想要的只是连接超时?
抛出exception类型的差异可能会破坏现有代码。
例如,在Socket.getInputStream().read()
阻塞时从不同的线程关闭Socket
将导致替换后的AsynchronousCloseException ,而不是遗留代码可能期望的SocketException
。 ( AsynchronousCloseException
不是SocketException
的子类。)
但是,如果来自其他线程的关闭在read()
之前进入,则Socket.getInputStream().read()
仍将抛出SocketException
。