socket-JAVA代理服务器,用浏览器打开的时候显示的网页信息总是不全,有时候显示不出来,求大神帮我看看

问题描述

JAVA代理服务器,用浏览器打开的时候显示的网页信息总是不全,有时候显示不出来,求大神帮我看看

package work;
import java.io.*;
import java.net.*;

public class MMProxy extends Thread {

static public int CONNECT_RETRIES = 5;    //尝试与目标主机连接次数
static public int CONNECT_PAUSE = 5;  //每次建立连接的间隔时间
static public int TIME_OUT = 50;//每次尝试连接的最大时间
static public int BUFSIZ = 4096;  //缓冲区最大字节数
protected static Socket csocket;//与客户端相连的socket

public MMProxy(Socket cs) {
    csocket = cs;
    start();
}

public void run() {
    String buffer = "";//请求头
    String host = "";//目标主机IP地址
    String URL = "";//请求URL
    int port = 8080;
    Socket ssocket = null;//套接字
    InputStream cinput = null, sinput = null;//cinput为客户输入流,sinput为服务器输入流
    OutputStream coutput = null, soutput = null;//coutput为客户输出流,soutput服务器输出流
    try {//服务器监听客户端的套接字
        csocket.setSoTimeout(TIME_OUT);//超过了50则返回一个异常
        cinput = csocket.getInputStream();
        coutput = csocket.getOutputStream();
        while (true) {//服务端读来自客户端的输入流
            int c = cinput.read();
            if (c == -1) {
                break;//-1为结尾标志
            }
            if (c == 'r' || c == 'n') {
                break;
            }
            buffer = buffer + (char) c;//读取第一行的数据
        }
        URL = getRequestURL(buffer);
        int n;
        n = URL.indexOf("//");//找到URL中“//”的位置
        if (n != -1) {
            host = URL.substring(n + 2);
        }
        n = host.indexOf("/");
        if (n != -1) {
            host = host.substring(0, n);//抽取host
        }
        n = host.indexOf(":");//分析端口号
        if (n != -1) {
            port = Integer.parseInt(host.substring(n + 1));
            host = host.substring(0, n);
        }
        int tetry = CONNECT_RETRIES;
        while (tetry-- != 0) {//尝试与目标主机建立连接
            try {
                ssocket = new Socket(host, port);
                break;
            } catch (Exception e) {
            }
            Thread.sleep(CONNECT_PAUSE);//等待
        }
        if (ssocket != null) {
            ssocket.setSoTimeout(TIME_OUT);
            sinput = ssocket.getInputStream();
            soutput = ssocket.getOutputStream();
            soutput.write(buffer.getBytes());
            System.out.println(buffer);
            pipe(cinput, sinput, coutput, soutput);//pipe在两个socket之间进行读写
            //SocketAddress address=new InetSocketAddress("192.168.0.1",8080);
            //Proxy proxy=new Proxy(Proxy.Type.HTTP,address);
            //URL pageUrl=new URL(host);
            //HttpURLConnection httpUrlConn = (HttpURLConnection)pageUrl.openConnection(proxy);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            csocket.close();
            cinput.close();
            coutput.close();
        } catch (Exception e1) {
            System.out.println("nClient Socket Closed Exception:");
            e1.printStackTrace();
        }
        try {
            ssocket.close();
            sinput.close();
            soutput.close();
        } catch (Exception e2) {
            System.out.println("nServer Socket Closed Exception:");
            e2.printStackTrace();
        }
    }
}

public String getRequestURL(String buffer) {//读取URL第一行
    String[] tokens = buffer.split(" ");
    String URL = "";
    for (int i = 0; i < tokens.length; i++) {
        if (tokens[i].startsWith("http://")) {
            URL = tokens[i];
            break;
        }
    }
    return URL;
}

public void pipe(InputStream cinput, InputStream sinput, OutputStream coutput, OutputStream soutput) {//主机与代理服务器的数据通道
    try {
        int length;
        byte bytes[] = new byte[BUFSIZ];
        while (true) {
            try {
                while ((length = cinput.read(bytes)) > 0) {
                    soutput.write(bytes, 0, length);
                }
                //else if(length<0)break;
            } catch (SocketTimeoutException e) {
            } catch (InterruptedIOException e) {
                System.out.println("nRequest Exception:");
                e.printStackTrace();
            }
            try {
                while ((length = sinput.read(bytes)) > 0) {
                    coutput.write(bytes, 0, length);
                }
                 //else if (length<0) ;
                //    break;
            } catch (SocketTimeoutException e) {
            } catch (InterruptedIOException e) {
                System.out.println("nResponse Exception:");
                e.printStackTrace();
            }
        }
    } catch (Exception e0) {
        System.out.println("Pipe异常: " + e0);
    }
}

public static void main(String args[]) {
    try {
        ServerSocket ssock = new ServerSocket(8080);//监听端口8080
        while (true) {
            Socket lsocket = ssock.accept();//使sever端处于等待状态,直到接受来自客户端的请求,并返回一个与客户通信的socket对象
            new MMProxy(lsocket);//.start();//从请求中取出连接,这时已经建立好了与客户端的双向连接
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

解决方案

用socket写一个支持http1.1标准的web proxy不可能只有这么点代码,这代码明显不靠谱。它勉强能工作就不错了。
你可以用fiddler看下http报文,是什么不支持。

解决方案二:

我只想知道你这个“代理服务器”是如何获得请求的……而且HTTP请求头根本就不是http://host/这样的格式啊

时间: 2025-01-30 11:50:05

socket-JAVA代理服务器,用浏览器打开的时候显示的网页信息总是不全,有时候显示不出来,求大神帮我看看的相关文章

按钮-自己参照书本写了一个Java Swing中的容器类入门程序设计,但是运行结果不对,求大神帮帮忙!

问题描述 自己参照书本写了一个Java Swing中的容器类入门程序设计,但是运行结果不对,求大神帮帮忙! /*题目是这样的:创建一个窗体在其中摆放两个内容面板对两个面板进行边框个性化设置.初始状态为第二个面板不可见,当单击第一个面板中的"打开"按钮时,第二个面板即可见:当单击第一个面板中的"关闭"按钮时,第二个面板消失. 以下是我结合书本写的代码,不知道为什么运行不了???*/import javax.swing.*;import java.awt.*;impor

java 调用cmd 执行读取sql文件问题?求大神帮看下

问题描述 java 调用cmd 执行读取sql文件问题?求大神帮看下 Runtime run =Runtime.getRuntime(); Process process = run.exec("cmd /cmysql -u root -pssdlh test <d:/test.sql"); InputStreamReader ir = new InputStreamReader(process .getInputStream()); LineNumberReader input

用java开发一个安卓客户端在线交流APP,是怎么实现添加好友的?求大神帮我看看这段代码。

问题描述 用java开发一个安卓客户端在线交流APP,是怎么实现添加好友的?求大神帮我看看这段代码. private void submit() { dialog = ProgressDialog.show(this, "提示", "处理中.."); new AsyncTask() { @Override protected String doInBackground(String... params) { String urlString = AppConstan

jquery下拉菜单在浏览器中只显示1像素,求大神帮帮忙

问题描述 jquery下拉菜单在浏览器中只显示1像素,求大神帮帮忙 本人小菜鸟一枚,用jquery写了个简单的下拉菜单,代码如下:$(document).ready(function(){ $(""#navRight .jiantou"").hover(function(){ $(this).find("".xiangq"").stop().slideDown(""slow""); }f

求大神帮下忙,小弟需要一个java连接sql server数据库实现查询功能的代码

问题描述 求大神帮下忙,小弟需要一个java连接sql server数据库实现查询功能的代码 如题 求大神给个查询功能的代码 做毕业设计需要 帮帮忙 下面附上添加功能的代码 public int Add(Client c) { int count=0; try { con=this.getcon(); String sql=String.format("insert Client values('%s',%d,'%s','%s','%s','%s','%s',0,'%s')", c.g

ava基础 代码错误-Java新手,求大神帮小弟看看这段代码哪里错了,多谢!!!

问题描述 Java新手,求大神帮小弟看看这段代码哪里错了,多谢!!! class Student { //姓名 private String name; //年龄 private int age; //构造方法 public Student(){ } public Student(String name, int age){ this.name = name; this.age = age; } public String getName(){ return name; } public voi

代码分析-JAVA 求大神帮看下这段代码 怎么修改 救命啊

问题描述 JAVA 求大神帮看下这段代码 怎么修改 救命啊 真心看不懂 public static char[] a(char[] paramArrayOfChar) { char[] arrayOfChar1 = new char[12]; char[] arrayOfChar2 = new char[12]; arrayOfChar2[0] = '?'; arrayOfChar2[1] = '?'; arrayOfChar2[2] = 'o'; arrayOfChar2[3] = '/';

遍历-Java字符串问题,求大神帮帮忙

问题描述 Java字符串问题,求大神帮帮忙 请用Java写这个程序,思考题: I am a student ! 定义一个方法: !student a am I 我有思路,但是我实现代码有困难,我的思路是:先将原字符串转换为字符数组,然后从头遍历,判断某个字符是否为空,一旦为空,将前面的存放到list集合中.然后继续从下一个开始遍历,然后判断是否为空,不为空继续向下遍历,然后继续遍历到为空的那个字符,然后继续将不为空的作为一个整体存入list集合中,往复循环进行,直至全部不为空的字符个数全部进入l

谢谢大家-java综合题,我真的不知道set get 和this联合用怎么用还有super 求大神解答

问题描述 java综合题,我真的不知道set get 和this联合用怎么用还有super 求大神解答 综合题(本题主要是考验同学们对Java语法的熟悉程度) 定义一个抽象的"Role"类,有姓名,年龄,性别等成员变量 1. 要求尽可能隐藏所有变量(能够私有就私有,能够保护就不要公有),再通过GetXXX()和SetXXX()方法对各变量进行读写.具有一个抽象的play()方法,该方法不返回任何值,同时至少定义两个构造方法.Role类中要体现出this的几种用法. 2. 从Role类派