我参照 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 ,小弟在此现行谢过。
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 ,小弟在此现行谢过。
解决方案 »
- 多个关闭资源真的可以放在一个try里吗
- 十万火急!!!请问如何让JTable中的JProgress动起来,在线等,谢谢!
- Jfreechart 的 时间 轴问题.我觉得~~~~~~~~~~~~~~~~~~~~~~
- java 修改文件 格式取消了 麻烦回答了
- 关于键盘事件的问题
- OutputStreamWriter的问题
- 为什么有些类的变量命名为 ‘_XJXJ’ 这样的形式呢?
- 关于cmp与数据结构方面的问题,有兴趣进来看看
- ***help***如何在按扭上显示两行字?
- java 如何调用windows的API
- 网络编程问题
- [b]String[] tool=new String[] {script};[/b] 是什么用法?
下面就是 sClient 读请求 由sServer 发送
完毕后
sServer 读相应 由sClient发送给浏览器
就是这样请大家帮忙
qqq
IBM 的用的是InputStream/OutputStream,我用的是BufferedReader/BufferedWriter。
就是这个问题,BufferedReader/BufferedWriter 的readLine方法中是读取不到
crlf的,加上去就可以了
呵呵,其实很简单的问题
眼泪汪汪的,
可以了,感谢ne_rushjt