日期:2014-05-20  浏览次数:20769 次

简单的HttpProxy,有问题,急求Help
我参照 IBM 网站的一个简单代理服务器代码,自己写了一个,但是有问题。
IBM 的用的是InputStream/OutputStream,我用的是BufferedReader/BufferedWriter。

IBM 网站连接

IBM 网站代码连接(zip)


下面是我的代码:

Java code
 
import java.io.*;
import java.net.*;

public class HttpProxy extends Thread {

private static int TIMEOUT = 50;
private static int RETRIES = 5;

private Socket socketClient;
private Socket socketServer;

private BufferedReader brClient;
private BufferedWriter bwClient;
private BufferedReader brServer;
private BufferedWriter bwServer;

public HttpProxy() {

}

public HttpProxy(Socket s) {
this.socketClient = s;
}


@Override
public void run() {
String line;
String host;
int port = 80;

try {
socketClient.setSoTimeout(TIMEOUT);
socketClient.setTcpNoDelay(true);
brClient = new BufferedReader(new InputStreamReader(socketClient
.getInputStream()));
line = brClient.readLine();
host = line;

/*
* get the host and port
*/
int n;
n = host.indexOf("//");
if (n != -1)
host = host.substring(n + 2);
n = host.indexOf("/");
if (n != -1)
host = host.substring(0, n);
n = host.indexOf(":");
if (n != -1) {
port = Integer.parseInt(host.substring(n + 1));
host = host.substring(0, n);
}

System.out.println("------------------------------->>> request");
System.out.println(line);

/*
* get the to-server-side socket, try RETRIES times
*/
int retries = RETRIES;
while (retries-- > 0) {
try {
socketServer = new Socket(host, port);
break;
} catch (Exception ex) {/* not success and retry */
}
}
if (socketServer != null) {
socketServer.setSoTimeout(TIMEOUT);
socketServer.setTcpNoDelay(true);
bwServer = new BufferedWriter(new OutputStreamWriter(
socketServer.getOutputStream()));
} else {
socketClient.close();
return;
}

bwServer.write(line);
bwServer.flush();

brServer = new BufferedReader(new InputStreamReader(socketServer
.getInputStream()));
bwClient = new BufferedWriter(new OutputStreamWriter(socketClient
.getOutputStream()));

pipe(brClient, brServer, bwClient, bwServer);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socketClient != null && socketClient.isConnected()
&& !socketClient.isClosed())
socketClient.close();
if (socketServer != null && socketServer.isConnected()
&& !socketServer.isClosed())
socketServer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

System.out.println(">>>------> thread ends");
}

public void pipe(BufferedReader brClient, BufferedReader brServer,
BufferedWriter bwClient, BufferedWriter bwServer) {
String line;

while (true) {
try {
line = brClient.readLine();
if (line != null) {
System.out.println(line);
bwServer.write(line);
bwServer.flush();
} else
break;
} catch (Exception e) {
}

try {
line = brServer.readLine(); //在这儿一直没有响应,如果不加socketServer.setSoTimeout(TIMEOUT);就会挂起