1

我正在尝试创建一个小型 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 )

    }   

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

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

4

2 回答 2

2

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

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

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

于 2010-06-10T02:57:12.033 回答
0

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

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

于 2011-01-12T22:45:40.437 回答