-1

我正在尝试创建代理服务器。

我想逐字节读取网站,以便显示图像和所有其他内容。我试过 readLine 但我无法显示图像。您对如何更改代码并将所有数据与 DataOutputStream 对象发送到浏览器有什么建议吗?

try{
    Socket s = new Socket(InetAddress.getByName(req.hostname), 80);
    String file = parcala(req.url);
    DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
    BufferedReader dis = new BufferedReader(new InputStreamReader(s.getInputStream()));
    PrintWriter socketOut = new PrintWriter(s.getOutputStream());
    socketOut.print("GET "+ req.url + "\n\n");
    //socketOut.print("Host: "+req.hostname);
    socketOut.flush();
    String line;
    while ((line = dis.readLine()) != null){
        System.out.println(line);
    }
} 
catch (Exception e){}
}

编辑部分

这是我应该做的。我可以阻止被禁止的网站,但不能在我的程序中允许其他网站。

在过滤器程序中,您将在指定端口打开一个 TCP 套接字并等待连接。如果请求到来(即客户端键入一个 URL 来访问一个网站),应用程序将处理它以确定是否允许访问,然后使用相同的套接字将回复发送回客户端。在客户端打开她与 WebPolice 的连接后(并且她的请求已被检查并被允许),需要向客户端显示真实的网页。因此,既然用户已经提出了请求,那么现在轮到 WebPolice 转发请求,以便用户获取网页。因此,WebPolice 充当客户端并请求网页。这意味着您需要打开与 Web 服务器的连接(不关闭与用户的连接),通过此连接转发请求,得到回复并将其转发回客户端。您将使用线程来处理多个连接(同时和/或不同时间)。

4

3 回答 3

0

我不知道您到底想做什么,但是制作一个 HTTP 请求并读取它的响应所包含的内容比您在此处所做的要多。无论如何,Readline 都无法处理二进制数据。

你可以看看URLConnection类(这里偷来的):

URL oracle = new URL("http://www.oracle.com/");
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));

in然后您可以从对象中读取文本或二进制数据。

于 2012-10-16T13:55:01.087 回答
0

读取行会将读取的行视为字符串,因此除非您想弄乱转换为字节的问题,否则我不建议这样做。

我只会读取字节,直到您无法再读取,然后将它们写入文件,这应该允许您抓取图像,保持文件头完整,这在处理文本以外的文件时可能很重要。

希望这可以帮助。

于 2012-10-16T13:55:09.923 回答
0

而不是使用BufferedReader你可以尝试使用InputStream. 它有几种读取字节的方法。 http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html

于 2012-10-16T13:55:17.287 回答