繁体   English   中英

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

[英]Any issues with replacing new Socket() with SocketChannel.open().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() 调用? 当然你想要的只是连接超时?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM