使用套接字的Java代理
根据我使用的浏览器的不同,我在代码中遇到了一些问题,IE中正确显示了URL,但在Firefox中显示为纯文本(例如,www.microsoft.es在IE上看起来不错,但在Firefox上看不到)。 我不知道我做错了什么,我认为我使用的标题有问题,但我不确定 代码如下:使用套接字的Java代理,java,html,http,http-proxy,Java,Html,Http,Http Proxy,根据我使用的浏览器的不同,我在代码中遇到了一些问题,IE中正确显示了URL,但在Firefox中显示为纯文本(例如,www.microsoft.es在IE上看起来不错,但在Firefox上看不到)。 我不知道我做错了什么,我认为我使用的标题有问题,但我不确定 代码如下: import java.io.*; import java.net.*; import java.util.concurrent.*; public class Server { public void startSe
import java.io.*;
import java.net.*;
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(8080);
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 {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream());
String url = null;
int i=0;
String [] headers = new String [100];
String buffer;
while ((buffer = in.readLine()) != null) {
headers[i]=buffer;
i++;
if(buffer.contains("GET"))
{
String[] splitText = buffer.split(" ");
url = splitText[1];
}
if(buffer.contains("POST"))
{
String[] splitText = buffer.split(" ");
url = splitText[1];
}
if(buffer.contains("CONNECT"))
{
String[] splitText = buffer.split(" ");
url = "https://"+splitText[1];
}
if (buffer.isEmpty()) break;
}
URL u = new URL(url);
URLConnection connection = u.openConnection();
for (int x=1;x<i-1;x++){
if (!headers[x].contains("Accept-Encoding:")){
connection.setRequestProperty(headers[x].substring(0, headers[x].indexOf(":")).toString() , headers[x].replace(headers[x].substring(0, headers[x].indexOf(":") +2), "").toString());
}
}
boolean redirect = false;
int status = ((HttpURLConnection) connection).getResponseCode();
if (status != HttpURLConnection.HTTP_OK) {
if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_SEE_OTHER)
redirect = true;
}
if (redirect) {
String Url = connection.getHeaderField("Location");
URL urlloc = new URL(Url);
connection = urlloc.openConnection();
for (int x=1;x<i-1;x++){
if (!headers[x].contains("Accept-Encoding:")){
connection.setRequestProperty(headers[x].substring(0, headers[x].indexOf(":")).toString() , headers[x].replace(headers[x].substring(0, headers[x].indexOf(":") +2), "").toString());
}
}
}
byte[] chunk = new byte[1024];
int bytesRead;
InputStream stream;
stream = connection.getInputStream();
while ((bytesRead = stream.read(chunk)) > 0) {
out.write(chunk, 0, bytesRead);
out.flush();
}
out.close();
in.close();
clientSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.*;
导入java.net。*;
导入java.util.concurrent.*;
公共类服务器{
public void startServer(){
final ExecutorService clientProcessingPool=Executors.newFixedThreadPool(10);
Runnable serverTask=new Runnable(){
@凌驾
公开募捐{
试一试{
@抑制警告(“资源”)
ServerSocket ServerSocket=新的ServerSocket(8080);
while(true){
Socket clientSocket=serverSocket.accept();
提交(新的ClientTask(clientSocket));
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
};
线程serverThread=新线程(serverTask);
serverThread.start();
}
私有类ClientTask实现可运行{
私有套接字clientSocket;
专用客户端任务(套接字客户端套接字){
this.clientSocket=clientSocket;
}
@凌驾
公开募捐{
试一试{
BufferedReader in=新的BufferedReader(新的InputStreamReader(clientSocket.getInputStream());
BufferedOutputStream out=新的BufferedOutputStream(clientSocket.getOutputStream());
字符串url=null;
int i=0;
字符串[]头=新字符串[100];
字符串缓冲区;
而((buffer=in.readLine())!=null){
头[i]=缓冲区;
i++;
if(buffer.contains(“GET”))
{
String[]splitText=buffer.split(“”);
url=splitText[1];
}
if(buffer.contains(“POST”))
{
String[]splitText=buffer.split(“”);
url=splitText[1];
}
if(buffer.contains(“CONNECT”))
{
String[]splitText=buffer.split(“”);
url=“https://”+splitText[1];
}
if(buffer.isEmpty())中断;
}
URL u=新的URL(URL);
URLConnection=u.openConnection();
对于(int x=1;x我不确定问题是什么,但您应该使用Wireshark之类的工具检查浏览器和代理之间的实际网络流量,并将其与直接连接到站点时浏览器和站点之间的网络流量进行比较。我不知道,我没有注意到任何问题(除了那不是我误解和删除的问题的东西),但显然肯定有一个bug,否则为什么它不起作用呢?不,我没有这么说。我说,我找不到bug,但可能某个地方有bug。可能有。使用Wireshark调查问题。