我尝试为Http实现Java代理(Http将是Http工作后的扩展)。我在互联网上找到了很多资源,并试图自己解决所有问题。但是现在我来到了我坚持的地步。 我的Proxoy不会加载完整的http网站。套接字已经关闭,我收到很多错误消息。所以我想我尝试通过一个已关闭的Socket发送一些东西。
我的问题是现在。我不明白为什么会这样。我想了很多问题,但我找不到错误。从我这边只有当服务器关闭与我的代理服务器的连接时,套接字才会关闭。当我从服务器读取输入流上的-1时会发生这种情况。
我会很高兴得到任何帮助:-)
问候 克里斯托夫
public class ProxyThread extends Thread {
Socket client_socket;
Socket server_socket;
boolean thread_var = true;
int buffersize = 32768;
ProxyThread(Socket s) {
client_socket = s;
}
public void run() {
System.out.println("Run Client Thread");
try {
// Read request
final byte[] request = new byte[4096];
byte[] response = new byte[4096];
final InputStream in_client = client_socket.getInputStream();
OutputStream out_client = client_socket.getOutputStream();
in_client.read(request);
System.out.println("---------------------- Request Info --------------------");
System.out.println(new String(request));
Connection conn = new Connection(new String(request));
System.out.println("---------------------- Connection Info --------------------");
System.out.println("Host: " + conn.host);
System.out.println("Port: " + conn.port);
System.out.println("URL: " + conn.URL);
System.out.println("Type: " + conn.type);
System.out.println("Keep-Alive:" + conn.keep_alive);
server_socket = new Socket(conn.URL, conn.port);
InputStream in_server = server_socket.getInputStream();
final OutputStream out_server = server_socket.getOutputStream();
out_server.write(request);
out_server.flush();
Thread t = new Thread() {
public void run() {
int bytes_read;
try {
while ((bytes_read = in_client.read(request)) != -1) {
out_server.write(request, 0, bytes_read);
out_server.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
t.start();
int bytes_read;
while ((bytes_read = in_server.read(response)) != -1) {
out_client.write(response, 0, bytes_read);
out_client.flush();
//System.out.println("---------------------- Respone Info --------------------");
//System.out.println(new String(response));
}
//System.out.println("EIGENTLICH FERTIG");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client_socket.close();
server_socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
编辑: 我的HTTP代理现在有效。一旦你理解了ryl是什么,答案就非常有用了。如果您听到寻找解决方案,这些问题可能会对您有所帮助:
客户端是否仅向一个网站/网络服务器发送请求?我们总是拥有相同的端口/主机名吗?
答案中的循环非常有用,但想想放在哪里?
最后想一想:谢谢@EJP,你的回复非常有用。理解它只需要一点时间!
答案 0 :(得分:0)
你犯了所有常见的错误,还有一些错误。
不保证整个请求只能在一次读取中到达。您不能假设已经到达多个字节。你必须循环。
此阶段您没有检查流的结束。
您需要熟悉RFC 2616才能实现HTTP,特别是有关内容长度和传输编码的部分。
您不能假设服务器在发送回复后会关闭连接。
关闭输入或输出流或套接字会关闭套接字。这就是您SocketException: socket closed
。
当你进入HTTPS时,你需要查看CONNECT动词。
刷新套接字输出流什么都不做,并且要避免在循环内刷新,