Java / Groovy套接字 - 检测以非阻塞方式关闭的套接字

时间:2010-06-10 00:01:23

标签: java groovy input sockets nonblocking

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

我写过ALMOST的作品。它可以执行代理功能,但不能重写(尚未)。问题是,我无法检测远程套接字何时关闭而未进行阻塞读取。对于这个东西的功能而言,它能够检测到没有阻塞的套接字是至关重要的。我已经SCOURED 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 )

    }   

关闭套接字的测试从不表示套接字已关闭。并且,正如我所提到的,我找不到任何关于如何在不进行阻塞读取的情况下检测流上的“END OF FILE”条件的示例。

有一种方法。这里有人知道它是什么吗?

2 个答案:

答案 0 :(得分:2)

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

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

这是example显示使用SocketChannel的非阻塞I / O.

答案 1 :(得分:0)

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

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