Java 使用套接字编写代理
我正在使用套接字编写HTTP代理服务器,现在程序正在成功地接收请求,但我无法将其返回到浏览器Java 使用套接字编写代理,java,sockets,proxy,Java,Sockets,Proxy,我正在使用套接字编写HTTP代理服务器,现在程序正在成功地接收请求,但我无法将其返回到浏览器 import java.io.*; import java.net.*; import java.util.List; import java.util.Map; import java.util.concurrent.*; public class Server { public void startServer() { final ExecutorService clientProc
import java.io.*;
import java.net.*;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
public class Server {
public void startServer() {
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(80);
while (true) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
private class ClientTask implements Runnable {
private Socket clientSocket;
private ClientTask(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
// Read request
InputStream incommingIS = clientSocket.getInputStream();
byte[] b = new byte[8196];
int len = incommingIS.read(b);
if (len > 0) {
System.out.println("REQUEST"
+ System.getProperty("line.separator") + "-------");
System.out.println(new String(b, 0, len));
// Write request
Socket socket = new Socket("localhost", 80);
OutputStream outgoingOS = socket.getOutputStream();
outgoingOS.write(b, 0, len);
// Copy response
OutputStream incommingOS = clientSocket.getOutputStream();
InputStream outgoingIS = socket.getInputStream();
for (int length; (length = outgoingIS.read(b)) != -1;) {
incommingOS.write(b, 0, length);
}
incommingOS.close();
outgoingIS.close();
outgoingOS.close();
incommingIS.close();
socket.close();
} else {
incommingIS.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
我做错了什么?有人能帮我吗
谢谢 您假设在一次读取中获得了整个请求,而不是使用类似于响应循环的循环 您还假设它是由流的末尾终止的,这意味着客户端必须执行了shutdownOutput(),这在大多数协议中都不会发生
一般来说,这不是编写代理的正确方法。您需要为每个客户端启动两个线程,同时在两个方向复制数据,并推迟关闭套接字,直到您从两个方向读取EOS。您假设在一次读取中获得了整个请求,而不是使用类似于响应循环的循环 您还假设它是由流的末尾终止的,这意味着客户端必须执行了shutdownOutput(),这在大多数协议中都不会发生
一般来说,这不是编写代理的正确方法。您需要为每个客户端启动两个线程,同时在两个方向上复制数据,并推迟关闭套接字,直到您从两个方向读取EOS。Hi,您说在两个方向上复制数据是什么意思?我不明白我该怎么做…我告诉过你了。每个连接有两个线程。一个是向一个方向复制,另一个是向另一个方向复制。嗨,你说向两个方向复制数据是什么意思?我不明白我该怎么做…我告诉过你了。每个连接有两个线程。一个在一个方向复制,一个在另一个方向复制。