Java:在我的ProxyServer中处理浏览器的请求
我正在编写ProxyServer,首先我使用ServerSocket获取连接到我的套接字。然后我从连接的套接字获取InputStream并读取它。我已将浏览器的请求输出到控制台:Java:在我的ProxyServer中处理浏览器的请求,java,sockets,proxy,Java,Sockets,Proxy,我正在编写ProxyServer,首先我使用ServerSocket获取连接到我的套接字。然后我从连接的套接字获取InputStream并读取它。我已将浏览器的请求输出到控制台: GET http://mail.ru/ HTTP/1.1 Host: mail.ru Proxy-Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User
GET http://mail.ru/ HTTP/1.1
Host: mail.ru
Proxy-Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/31.0.1650.63 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: p=7nkAAOS6hAAA; mrcu=7D86524D326C5CB36F898F4A4CD9;
_ga=GA1.2.1174941236.1388398432; c=PCwPUwAAAPKbAAAiAgAAcQAAz5QIAgAA;
我必须创建新套接字才能将此请求写入internet,但套接字需要端口号和hostnameString才能连接
如果我们认为端口号总是80,那么从这个请求的哪个部分我必须得到主机名?这是什么http://mail.ru/ HTTP/1.1或主机:mail.ru
另外,我可以只发送到internet获取吗http://mail.ru/ HTTP/1.1放弃其他部分
最后一个问题是,我应该重写这个GET方法本身吗?我已经创建了最简单的代理服务器。它的工作速度不是很快,但是:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
/**
*
* @author
*/
public class DaniyarProxyServer {
public static final int port = 8000;
public static void main(String[] args) {
ServerSocket listener = null;
try {
listener = new ServerSocket(port);
System.out.println("Proxy started..");
while (true) {
try {
Socket client = listener.accept();
ClientHandler handler = new ClientHandler(client);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
class ClientHandler implements Runnable {
private Socket client;
private Socket internet;
private Thread thread;
public static int threadcount = 0;
private static int buffer_size = 8192;
private static String CRLF = "\r\n";
public int port = 80;
public ClientHandler(Socket client) {
this.client = client;
thread = new Thread(this, "Thread#" + threadcount);
System.out.println("Thread#" + threadcount + " is running now");
threadcount++;
thread.run();
}
@Override
public void run() {
try {
byte[] buffer = new byte[buffer_size];
BufferedInputStream clientIstream = new BufferedInputStream(client.getInputStream());
clientIstream.read(buffer);
String clientRequest = new String(buffer);
System.out.println(clientRequest);
String host = getHostFromRequest(clientRequest);
internet = new Socket(host, port);
BufferedOutputStream internetOstream = new BufferedOutputStream(internet.getOutputStream());
internetOstream.write(clientRequest.getBytes());
internetOstream.flush();
BufferedOutputStream clientOstream = new BufferedOutputStream(client.getOutputStream());
BufferedInputStream internetIstream = new BufferedInputStream(internet.getInputStream());
buffer = new byte[buffer_size];
int buffsize = 0;
while ((buffsize = internetIstream.read(buffer)) != -1) {
clientOstream.write(buffer, 0, buffsize);
}
clientOstream.flush();
clientIstream.close();
clientOstream.close();
internetIstream.close();
internetOstream.close();
} catch (Exception e) {
System.err.println("Exception " + e.getMessage());
}
}
private String getHostFromRequest(String request) {
String host = "";
StringTokenizer tok = new StringTokenizer(request, CRLF);
String method = tok.nextToken();
host = tok.nextToken();
host = host.substring("Host: ".length());
return host;
}
}
如果是HTTP代理,则获取主机头。然后将所有数据传递给传出流,并将它们复制回传入流。顺便说一句,为了与浏览器有广泛的兼容性,你必须注意分块。好的,我将使用主机头,我应该重写得到HTTP/1.1吗?如何重写?只需将输入复制到目标输出即可实现基本功能。这是我大学的实验室工作。如果我记得的话,那很好。只需从计算机上运行它并检查它。