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

IBM 网站代码连接(zip)

下面是我的代码:
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 ,小弟在此现行谢过。

解决方案 »

  1.   

    整个程序的思路是:建立一个监听 808 端口的 ServerSocket ss通过 ss.accept() 获取对应浏览器请求的 Socket sClient (因为代理,所以我们这儿可以获取浏览器请求)然后,读取 sClient 的请求头,获得请求的 Host 地址接着,创建连接 Host 的 Socket sServer
    下面就是 sClient 读请求 由sServer 发送
    完毕后
    sServer 读相应 由sClient发送给浏览器
    就是这样请大家帮忙
    qqq
      

  2.   

    问题的表现是:brServer.readLine()一直会阻塞,代码中有注释因为加了socketServer.setSoTimeout(TIMEOUT)所以会由timeout异常,但程序中未在catch中处理,故意作此设置
      

  3.   


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

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

  4.   

    2 ne_rush:嗯,好像这儿是有问题,我试试谢谢啦!
      

  5.   

    亲人啊,
    眼泪汪汪的,
    可以了,感谢ne_rushjt