2016-05-20 16 views
0

HTTPプロキシを実装しようとしました(HttpはHttpの動作後に拡張機能になります)。私はインターネット上で多くのリソースを見つけ、今までのところすべての問題を解決しようとしました。しかし今、私は立ち往生しています。 私のProxoyはhttpウェブサイト全体をロードしません。私はソケットが既に閉じていると、多くのエラーメッセージが表示されます。だから私は閉じたSocketを介して何かを送信しようとしていると思う。Java Httpプロキシが正しく動作しない

問題が解決しました。なぜそれがこのようなのか分かりません。私はこの問題について多くのことを考えていますが、間違いを見つけることはできません。私の側からサーバーは、私のプロキシサーバーへの接続を閉じると、ソケットが閉じられるだけです。これは、サーバーからの入力ストリームで-1を読み取ったときに発生します。

私は

挨拶 クリストフ

public class ProxyThread extends Thread { 
Socket client_socket; 
Socket server_socket; 
boolean thread_var = true; 
int buffersize = 32768; 

ProxyThread(Socket s) { 
    client_socket = s; 
} 

public void run() { 
    System.out.println("Run Client Thread"); 
    try { 
     // Read request 
     final byte[] request = new byte[4096]; 
     byte[] response = new byte[4096]; 

     final InputStream in_client = client_socket.getInputStream(); 
     OutputStream out_client = client_socket.getOutputStream(); 

     in_client.read(request); 
     System.out.println("---------------------- Request Info --------------------"); 
     System.out.println(new String(request));   

     Connection conn = new Connection(new String(request)); 
     System.out.println("---------------------- Connection Info --------------------"); 
     System.out.println("Host: " + conn.host); 
     System.out.println("Port: " + conn.port); 
     System.out.println("URL: " + conn.URL); 
     System.out.println("Type: " + conn.type); 
     System.out.println("Keep-Alive:" + conn.keep_alive); 
     server_socket = new Socket(conn.URL, conn.port); 
     InputStream in_server = server_socket.getInputStream(); 
     final OutputStream out_server = server_socket.getOutputStream(); 
     out_server.write(request); 
     out_server.flush(); 

     Thread t = new Thread() { 
      public void run() { 
       int bytes_read; 
       try { 
       while ((bytes_read = in_client.read(request)) != -1) { 
         out_server.write(request, 0, bytes_read); 
         out_server.flush(); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      } 
      }; 
      t.start(); 

     int bytes_read; 
     while ((bytes_read = in_server.read(response)) != -1) { 
      out_client.write(response, 0, bytes_read); 
      out_client.flush(); 
      //System.out.println("---------------------- Respone Info --------------------"); 
      //System.out.println(new String(response)); 
     } 

     //System.out.println("EIGENTLICH FERTIG"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      client_socket.close(); 
      server_socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 

EDIT :-)任意の助け幸せになる: 私のHTTPプロキシが機能するようになりました。あなたはrylが何をしているのか理解すれば答えはかなり有益です。

  • クライアントが1つのWebサイト/ Webサーバーにのみ要求を送信しますか?私たちは常に同じポート/ホスト名を持っていますか?

  • 答えのループは非常に便利ですが、どこに配置すると思いますか?

最後にお考えください:ありがとうございました。@EJPさんのお返事はとても役に立ちました。それを理解する時間がかかりました!

+0

あなたが確認できます。http://www.javaworld.com/article/2077322/core-java /core-java-sockets-programming-in-java-a-tutorial.html。それは助けることができます! –

+0

@ SunilChakravarthyオラクルが提供する完全なネットワーキングのチュートリアルがある場合、なぜ20年前の雑誌記事を掘り起こしているのか分かりません。 – EJP

+0

古い記事が間違っています!私はあなたの問題を解決するとき、記事の年齢は問題ではないと言います。少なくとも、それは物事がどのように行われたかについてのアイデアを与えることができます。何を言います! @EJP –

答えて

0

すべての通常の間違いをしています。

  1. リクエスト全体が単一の読み込みで到着するとは限りません。 1バイト以上が到着したと想定することはできません。ループする必要があります。

  2. この段階でストリームの終了を確認していません。

  3. HTTPを実装するには、特にContent-lengthと転送エンコーディングに関する部分を理解する必要があります。

  4. 応答を送信した後にサーバーが接続を切断するとは想定できません。

  5. 入力ストリームまたは出力ストリームのいずれかを閉じるか、ソケットがソケットを閉じます。これがあなたのSocketException: socket closedの理由です。

  6. HTTPSになったら、CONNECT動詞を調べる必要があります。

  7. ソケットの出力ストリームをフラッシュし、何もしませんし、ループ内のフラッシングを回避すべきである、

+0

to 1:私はwhileループでこれを行うと思いましたか? 〜2:私は-1で小切手をすると思いましたか? 〜4:私は最後にFinalyと一緒にすべてを閉じたと思った? –

+0

1,2。実際の長さとストリームの早すぎる終了の可能性を無視して、最初の読み込みから間違って組み立てられた文字列を持つ 'Connection'オブジェクトを構築しています。 4.あなたは「ソケットクローズ」例外を受けています。つまり、あなたは早すぎる*ソケットクローズを行っています。なぜか、あなたにその理由を伝えています。 – EJP

+0

私は-1の意味を理解していないと思います。 inputstream.read()= -1ならば、サーバーは私たちとの接続を閉じたと思った。したがって、このソケットにはメッセージは到着しません。私はすべてを閉じることができます。 to 1,2、私はホスト名とソケットを開くためのポートを見つける必要があります。私はこのようにすることができない場合。正しい方法は何でしょうか? –

関連する問題