Java 用SocketChannel.open().Socket()替换新Socket()有任何问题吗?
如果我只是更换,会出什么问题Java 用SocketChannel.open().Socket()替换新Socket()有任何问题吗?,java,sockets,nio,socketchannel,Java,Sockets,Nio,Socketchannel,如果我只是更换,会出什么问题 socket = new Socket() 与 背景:我有一些使用newsocket()的遗留代码,我希望能够中断Socket.connect()调用。我不想重写代码来使用NIO。我了解到Thread.interrupt()不会中断socket.connect(),但是另一个线程上的socket.close()应该会中断连接。奇怪的是,这适用于Java7,但不适用于Java6 我不知怎的想到,使用socket=SocketChannel().open().sock
socket = new Socket()
与
背景:我有一些使用newsocket()
的遗留代码,我希望能够中断Socket.connect()
调用。我不想重写代码来使用NIO。我了解到Thread.interrupt()
不会中断socket.connect()
,但是另一个线程上的socket.close()
应该会中断连接。奇怪的是,这适用于Java7,但不适用于Java6
我不知怎的想到,使用socket=SocketChannel().open().socket()
会神奇地允许我使用Thread.interrupt()
来中断socket.connect()
。它没有,但奇怪的是,它也在Java6中生成了socket.close()
interruptsocket.connect()
请注意,我没有以任何方式直接使用附带的SocketChannel
——它出现在我创建Socket
时,以后不再使用
这会有什么问题?有几个问题
为什么要中断connect()调用?当然,您想要的只是连接超时?抛出异常类型的差异可能会破坏现有代码 例如,当
Socket.getInputStream().read()
阻塞时,从不同线程关闭Socket
,将导致替换后,而不是旧代码可能期望的SocketException
。(AsynchronousCloseException
不是SocketException
的子类)
但是,
Socket.getInputStream().read()
仍然会抛出SocketException
,如果在read()
(2)之前从另一个线程得到关闭不是问题,因为这是一个请求/响应协议。我将调查(1)。我想中断connect()
的原因:一个线程正在尝试IPv6,另一个线程正在尝试IPv4,如果IPv6被破坏,以至于connect()
将超时,我想中断该connect()
一旦建立IPv4连接。在这种情况下,最好以非阻塞模式连接通道,然后关闭触发OP_CONNECT的通道。我想我同意,但我希望避免为NIO重新配置代码的工作。但也许我可以在成功连接后配置回阻塞,然后再处理套接字流?您(或某人)能否显示将替换的代码socket=SocketChannel.open().socket();socket.connect(地址、超时)代码>?我的测试表明,socket.setSootimeout()
在通过SocketChannel获取的套接字上工作正常,导致在阻塞socket.getInputStream().read()
时抛出预期的java.net.SocketTimeoutException
。我看到了一个太阳虫报告,表明了相反的情况。在这个网站的某个地方引用过。
socket = SocketChannel.open().socket()?