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 )

    }   

ソケットが閉じられているかどうかのテストは、ソケットが閉じられたことを示すことはありません。そして、前述したように、ブロッキング読み取りを行わずにストリームの「END OF FILE」条件を検出する方法の例を見つけることができません。

方法がなければなりません。ここにいる誰かがそれが何であるか知っていますか?

4

2 に答える 2

2

java.net.SocketI / Oに使用していると思います。Java でノンブロッキング I/O を行うには、NIO パッケージを使用する必要があります。

特に、java.nio.channels.SocketChannel通信には a を使用する必要があります。チャネルで呼び出すconfigureBlocking(false)と、 read() は、読み取ったデータの量、閉じた場合は -1、またはデータが利用できない場合は 0 を返します。一部のエラー条件でも例外がスローされる可能性があります。

SocketChannel を使用したノンブロッキング I/Oの例を次に示します。

于 2010-06-10T02:57:12.033 に答える
0

いいえ、これは役に立ちません。反対側で接続がシャットダウンされた場合に読み取ることになっていること、およびこれが発生したときにjava nioセレクターがチャネルをレディセットに入れないことをどうやって知ることができますか?

私が知る限り、それは設計によって壊れているだけであり、これを行う方法はありません。私が間違っている場合は誰かが私を訂正してください...

于 2011-01-12T22:45:40.437 に答える