【问题标题】:Java / Groovy Socket - Detecting the socket being closed in a non-blocking wayJava / Groovy Socket - 检测以非阻塞方式关闭的套接字
【发布时间】:2010-06-10 00:01:22
【问题描述】:

我正在尝试创建一个小型 HTTP 代理,它可以根据需要重写请求/标头以满足我的要求。如果一个已经存在,请指出我。否则……

我写了一些几乎可以工作的东西。它可以做代理功能,但不能重写(还)。问题是,如果不进行阻塞读取,我无法检测到远程套接字何时关闭。对于这个东西的功能来说,它能够检测到套接字被关闭而不阻塞是至关重要的。我已经搜索了 Java API 文档,但我找不到任何迹象表明它甚至是可能的。这是我所拥有的:

    while ( this.inbound.isConnected() && this.outbound.isConnected() ) { 

      try {
        while ( ( available = readFromClient.available() ) != 0 ) { 
          if ( available > 1024 ) available = 1024
          bytesRead = readFromClient.read( buffer, 0, available )
          writeToServer.write( buffer, 0, bytesRead )
        }   

        while ( ( available = readFromServer.available() ) != 0 ) { 
          if ( available > 1024 ) available = 1024
          bytesRead = readFromServer.read( buffer, 0, available )
          writeToClient.write( buffer, 0, bytesRead )
        }                                                                                       
      } catch (e) { 
        print e
      }   

      println "Connected:      " + this.inbound.isConnected() 
      println "Bound:          " + this.inbound.isBound() 
      println "InputShutdown:  " + this.inbound.isInputShutdown() 
      println "OutputShutdown: " + this.inbound.isOutputShutdown() 
      print "\n";

      Thread.sleep( 10 )

    }   

正在关闭的套接字的测试永远不会表明套接字已关闭。而且,正如我所提到的,我找不到任何关于如何在不进行阻塞读取的情况下检测流上的“文件结束”条件的示例。

必须有办法。有人知道这是什么吗?

【问题讨论】:

    标签: java groovy input sockets nonblocking


    【解决方案1】:

    我假设您在 I/O 中使用 java.net.Socket。为了在 Java 中进行非阻塞 I/O,您必须使用 NIO 包。

    特别是,您需要使用java.nio.channels.SocketChannel 进行通信。在通道上调用configureBlocking(false),然后 read() 将返回读取的数据量,-1 表示关闭,如果没有数据可用,则返回零。在某些错误条件下也可能引发异常。

    这是一个 example 显示使用 SocketChannel 的非阻塞 I/O。

    【讨论】:

      【解决方案2】:

      不,这没有帮助。如果连接在另一端关闭,并且 java nio 选择器在发生这种情况时没有将通道置于就绪集中,您怎么知道您应该读取?

      据我所知,它只是被设计破坏了,而且没有办法做到这一点。如果我弄错了,请有人纠正我...

      【讨论】:

      • 同意!我目前正面临这个问题 - 如果另一方被杀死,我不会收到读取事件,甚至写入套接字也不会出错。好痛啊……
      猜你喜欢
      • 2015-07-20
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2012-05-26
      相关资源
      最近更新 更多