1

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

socket = new Socket()

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

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

我不知何故想到 usingsocket = SocketChannel().open().socket()会神奇地让我使用Thread.interrupt()to 打断socket.connect()。它没有,但奇怪的是,它确实在 Java 6 中也产生了socket.close()中断!socket.connect()

请注意,我没有SocketChannel以任何方式直接使用附件——它在我创建时出现,Socket并且再也不会出现。

这有什么问题?

4

2 回答 2

3

有几个。

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

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

于 2013-11-04T21:37:44.003 回答
0

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

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

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

于 2015-06-13T17:28:47.863 回答