ずに立ち往生私は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 /レスポンスのペアを取得しますが、ある時点ではまだプログラムが停止しています。
どういうわけか私は本当のささいなエラーをした私はただ見て管理していない、またはプログラムが動作するはずですが、単に本当の理由ないかと思います。
すべてのヘルプは、事前に、感謝感謝です!
ありがとうございました!実際に何が起こっていることは読み取ることがより多くのデータがある場合、それはわからないので、読み込みがブロックあなたのスレッドをmehodことで、プログラムがまだ同じ – Mark
まあに動作し、私はそれを試してみましたが、それは助けにはなりませんでした。 – capsula
なぜそれが助けになるのですか? ObjectOutputStreamの特定の場合に役立ちます。これはそうではありません。 – EJP