2010-11-27 18 views
2

ずに立ち往生私はJavaで動作するように簡単なマルチスレッドのプロキシを取得しようとしています。しかし、私は最初のGET要求とウェブページからの応答の後、私のブラウザでウェブページを表示することはできません。プログラムはちょうど立ち往生しています(私のコードからわかるように、デバッグのためのstdoutがありますが、Webページのソースコードが表示されますが、「クライアント書き込み後」の出力後には何も起こりません(例外も何もありません...))。単純なJava HTTPプロキシは、エラーメッセージ

import java.net.*; 
import java.util.*; 

import java.io.*; 

public class Proxy 
{ 

public static void main(String[] args) 
{ 
    try 
    { 
     ServerSocket listensocket = new ServerSocket(Integer.valueOf(args[0])); 
     while(true) 
     { 
      System.out.println("wait"); 
      Socket acceptsocket = listensocket.accept(); // blocking call until it receives a connection 
      myThread thr = new myThread(acceptsocket); 
      thr.start(); 
     } 

    } 
    catch(IOException e) 
    { 
     System.err.println(">>>>" + e.getMessage()); 
     e.printStackTrace(); 
    } 

} 

static class myThread extends Thread 
{ 
    Socket acceptsocket; 
    int host, port; 

    String url; 

    myThread(Socket acceptsocket) 
    { 
     this.acceptsocket=acceptsocket; 
    } 
    public void run() { 
     try 
     { 
      System.out.println("hello"); 

      Socket client = acceptsocket; 
      //client.setSoTimeout(100); 
      InputStream clientIn = client.getInputStream(); 
      //BufferedInputStream clientIn=new BufferedInputStream(clientis); 
      OutputStream clientOut = client.getOutputStream(); 
      System.out.println("hello"); 

      String clientRequest = readStuffFromClient(clientIn); // parses the host and what else you need 
      System.out.print("Client request: -----\n"+clientRequest); 

      Socket server; 
      server = new Socket("xxxxxxxxxxxxx" , 80); 


      InputStream serverIn = server.getInputStream(); 
      //BufferedInputStream serverIn=new BufferedInputStream(serveris); 
      OutputStream serverOut = server.getOutputStream(); 


      serverOut.write(clientRequest.getBytes()); 
      serverOut.flush(); 

      String serverResponse = readStuffFromClient(serverIn); 

      System.out.print("Server Response: -----\n"+serverResponse); 

      clientOut.write(serverResponse.getBytes()); 
      clientOut.flush(); 
      System.out.println("After Client Write"); 

      clientIn.close(); 
      clientOut.close(); 
      serverIn.close(); 
      serverOut.close(); 
      server.close(); 
      client.close(); 


     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 
    private String readStuffFromClient(InputStream clientdata) 
    { 
     ByteArrayOutputStream response = new ByteArrayOutputStream(); 
     StringBuffer request=new StringBuffer(8192); 
     int i, httpstart,n=-1 ; 
     byte[] buffer = new byte[8192]; 

     System.out.println("beforetry"); 

     try 
     { 

      while((n = clientdata.read(buffer))!=-1) 
      { 
      System.out.println("before"); 
      response.write(buffer,0,n); 
      //response.flush(); 
       } 
       request=new StringBuffer(response.toString()); 
       /*System.out.println("new:"+n+" "+ request.toString()); 
       System.out.println("End client data");*/ 

     }  
     catch (Exception e) 
     { 
      System.out.println("here"); 
      System.out.println(e); 
      e.printStackTrace(); 
      i = -1; 
     } 




      System.out.println("End manipulation method"); 
      return request.toString(); 
     } 
} 



} 

は(これは1つが、私はすでににBufferedInputStreamを使用しようとした見ることができますコメントから、私のプログラムのストリップダウン動作していない例です)。一般に、このプログラムは、ブラウザからの最初のGET要求に対しても非常に応答しません。クライアントデータを1回だけ(ループではなく)読み込むと、もう少し時間がかかります。より多くのGET /レスポンスのペアを取得しますが、ある時点ではまだプログラムが停止しています。

どういうわけか私は本当のささいなエラーをした私はただ見て管理していない、またはプログラムが動作するはずですが、単に本当の理由ないかと思います。

すべてのヘルプは、事前に、感謝感謝です!

答えて

-1

最初のOutputStreamしてからInputStreamを取得してください!

InputStream clientIn = client.getInputStream(); 
OutputStream clientOut = client.getOutputStream(); 

に変更し、それを:

OutputStream clientOut = client.getOutputStream(); 
InputStream clientIn = client.getInputStream(); 
+0

ありがとうございました!実際に何が起こっていることは読み取ることがより多くのデータがある場合、それはわからないので、読み込みがブロックあなたのスレッドをmehodことで、プログラムがまだ同じ – Mark

+0

まあに動作し、私はそれを試してみましたが、それは助けにはなりませんでした。 – capsula

+0

なぜそれが助けになるのですか? ObjectOutputStreamの特定の場合に役立ちます。これはそうではありません。 – EJP

-1

これはそれを動作させるだろう。

それはまだ

を読むことが可能な、より多くのデータがある場合、それはあなたが使用することが重要だチェックします私はByteArrayISが利用可能なメソッドを実装していないと思うので、BufferedIS。

BufferedInputStream bis = new BufferedInputStream(clientdata); 
      System.out.println("beforetry"); 

      try { 
       while(bis.available() > 0){ 
        n = bis.read(buffer); 
        response.write(buffer, 0, n); 
       } 
+0

フムのためだったことを知りませんでした空のファイルをダウンロードしようとしています... – Mark

+0

これは、ソケット受信バッファを空にするとすぐに停止します。読み込みスレッド*は、より多くのデータが到着するまで、またはFINをブロックする必要があります。 – EJP

0

クライアントから読み取ってサーバーに書き込むスレッドと、受け入れたソケットごとに反対側を行うスレッドの2つが必要です。一方向からEOSを読むとき、出力のために反対側のソケットをシャットダウンし、そのスレッドの入力ソケットがすでに出力のためにシャットダウンされていれば、両方のソケットを閉じます。どちらの場合も、EOSを読み取ったスレッドを終了します。

関連する問題