Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用SocketChannel.open().Socket()替换新Socket()有任何问题吗?_Java_Sockets_Nio_Socketchannel - Fatal编程技术网

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()
interrupt
socket.connect()

请注意,我没有以任何方式直接使用附带的
SocketChannel
——它出现在我创建
Socket
时,以后不再使用

这会有什么问题?

有几个问题

  • 通过SocketChannel获取的套接字似乎不支持读取超时
  • 套接字的InputStream和OutputStream不是独立的:它们有一个共同的互锁

  • 为什么要中断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()?