从网站读取字节

时间:2012-10-16 13:50:58

标签: java sockets

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

我想逐字节阅读网站,以便我可以显示图像和所有其他内容。我试过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服务器的连接(不关闭与用户的连接),通过此连接转发请求,获取回复并将其转发回客户端。您将使用线程来处理多个连接(同时和/或在不同时间)。

3 个答案:

答案 0 :(得分:0)

我不知道你究竟想要做什么,但是制作一个HTTP请求并阅读它的响应比你在这里做的更多。无论如何,Readline不适用于二进制数据。

您可以查看URLConnection班级(stolen here):

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

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

答案 1 :(得分:0)

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

我只是读取字节,直到你不能再读,然后把它们写到文件中,这应该允许你抓取图像,保持文件头完好无损,这在处理文本以外的文件时很重要。 / p>

希望这有帮助。

答案 2 :(得分:0)

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