我试图连接到服务器,然后发送一个HTTP请求(在这种情况下为GET)。这个想法是请求一个文件,然后从服务器接收它。从套接字读取二进制数据
它应该同时处理文本文件和二进制文件(例如imgs)。我对文本文件没有问题,它的工作原理非常完美,但是我在使用二进制文件时遇到了一些麻烦。
首先,我声明一个BufferedReader(读头和文本文件)和DataInput中的流:
BufferedReader in_text = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
DataInputStream in_binary = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
然后,我阅读in_text头,发现如果它是一个文本文件或二进制文件。如果它是一个文本文件,我在StringBuilder中正确读取它。如果是二进制文件,我声明一个字节[filesize]并存储in_binary的以下内容。
byte[] bindata = new byte[filesize];
in_binary.readFully(bindata);
而且它不起作用。我得到一个EOFException。
我以为可能in_binary仍然在流的第一个位置,所以它还没有读取头。所以我捕获了头部的长度并在in_binary中跳过了这些字节。
byte[] bindata = new byte[filesize];
in_binary.reset();
in_binary.skip(headersize);
in_binary.readFully(bindata);
而且依然如此。
会发生什么情况?
谢谢!
PD:我知道我可以使用URLConnection和所有这些。这不是问题。
啊!我认为这是重点。我将尝试使用InputStream来读取头文件。还是有另一个更好的解决方案?我只是想了解HTTP如何工作,这不适用于任何“专业”使用,这就是为什么我不使用URLConnection;) – 2010-11-07 16:04:05
我会做以下事情:首先,我会从流和缓冲区读取,直到我请参阅HTTP响应标头的末尾(“\ r \ n \ r \ n”)。这将是响应标题。您可以使用ASCII编码将其解码为字符串,然后解析它以获取内容长度。然后,发出另一个读取内容长度字节的流。 – feroze 2010-11-07 17:59:20