使用套接字来分块数据

时间:2012-06-26 18:19:34

标签: java sockets inputstream chunked

我正在尝试创建一个程序,它将直接从套接字获取数据,而不是使用HttpURLConnection或HttpClient。使用套接字可以让我更自由地操作数据以满足要求。我希望使用套接字,我可以保留与每个块一起发送的块头。以下是我的代码来实现这一目标。不幸的是,即使代码运行没有任何错误,它也会在停止之前运行至少40秒。此外,即使我检查程序已连接到服务器,我也没有从服务器获取任何InputStream。

    Socket socket = new Socket(hostAddr, port);
    InputStream in = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(in);
    char[] streamBuff = new char[8192];
    StringBuilder receivedData = new StringBuilder();
    int count = 0;
    while((count = isr.read(streamBuff)) > 0)
    {
        receivedData.append(streamBuff, 0, count);
    }
    System.out.println(receivedData);

2 个答案:

答案 0 :(得分:1)

HTTP/1.1persistent connections。您正在读取该循环中的所有响应块,然后阻塞,直到服务器超时并关闭TCP连接。

编辑0:

顺便说一下,您没有向服务器发送请求,这就是您没有得到任何回报的原因。如果你想自己实现协议,请研究协议。

答案 1 :(得分:0)

您首先需要提出GET或POST请求。这是一个示例,说明如何使用openStream(),然后阅读InputStream

public class DateWala {

    public static void main(String[] args){

        try {
            URL url = new URL("http://www.google.com");
            InputStream is = url.openStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            String s = null;

            while ((s=br.readLine())!=null){
                System.out.println(s);
            }

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}