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

时间:2013-11-04 19:36:34

标签: java sockets nio socketchannel

如果我只是替换

,会出现什么问题
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时出现,而不会再出现。

这会出现什么问题?

2 个答案:

答案 0 :(得分:2)

有几个。

  1. 通过SocketChannel获取的Socket似乎不支持读取超时。
  2. 套接字的InputStream和OutputStream不是独立的:它们有一个共同的互锁。
  3. 为什么要中断connect()调用?当然你想要的只是一个连接超时?

答案 1 :(得分:0)

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

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

但是,如果其他帖子的关闭在Socket.getInputStream().read()之前进入,SocketException仍会抛出read()