首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

简单的HttpProxy,有有关问题,求Help

2011-12-23 
简单的HttpProxy,有问题,急求Help我参照 IBM 网站的一个简单代理服务器代码,自己写了一个,但是有问题。IBM

简单的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);就会挂起


if (line != null) {
System.out.println(line);
bwClient.write(line);
} else
break;
} catch (Exception e) {

}
}

}

public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(808);
Socket s = ss.accept();
new HttpProxy(s).start();
} catch (IOException e) {
e.printStackTrace();
}
}

}




使用方法:
1.将浏览器的代理服务器设置为127.0.0.1端口808
(具体:工具->Internet选项->连接(选项卡)->局域网设置->代理服务器)

2.用浏览器访问web页面



我的代码有问题
IBM的可以正常运行


希望各路英雄施以援手,感激涕零 T_T ,小弟在此现行谢过。



[解决办法]
学习,顶一下。
[解决办法]

IBM 的用的是InputStream/OutputStream,我用的是BufferedReader/BufferedWriter。



就是这个问题,BufferedReader/BufferedWriter 的readLine方法中是读取不到
crlf的,加上去就可以了
呵呵,其实很简单的问题

热点排行