3

我有一个 Android 应用程序,它连接到服务器并不断发送一些信号数据(使用 HttpURLConnection)。在服务器上,一个脚本(shell 或 python,不完全知道,这不是我的部分)当前处理这个流,并且为每个传入的数据包设置一个 curl 请求以将此包发布到一个 servlet(在 Jetty 8 web 中运行容器)。这只是一个临时解决方案,因为我不知道如何直接连接数据并将数据流式传输到 servlet。作为要求,数据传输应使用 HTTP 协议,以免被任何防火墙阻止。

那么,是否有可能首先连接到一个 servlet,然后长时间(比如几分钟或几小时)流式传输数据?我想知道我没有找到类似的问题/解决方案。我的意思是这不是特殊情况。这与将大文件上传到 servlet 的操作相同吗?

servlet 实际上如下所示:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    System.out.println("StreamingServlet#doPost(): IN");
    BufferedReader reader = request.getReader();
    String data = "";

    while ((data = reader.readLine()) != null)
    {
        System.out.println("Data: " + data);
    }
    reader.close();

    System.out.println("StreamingServlet#doPost(): OUT");
}

android 应用程序有 3 个使用 HttpURLConnection 的方法:

private Boolean connect(URL URLdest)
{
    try
    {
        connection = (HttpURLConnection) URLdest.openConnection();
        connection.setDoOutput(true);
        connection.setChunkedStreamingMode(0);
        oSWout = new OutputStreamWriter(connection.getOutputStream());
    }
    catch (IOException e)
    {
        return false;
    }
    return true;
}   

public void send(String packet)
{
    try
    {
        // TODO clOSWout.write and clOSWout.flush block may freeze if connection is lost. Somehow no exception is thrown and thread hangs instead.
        // It only occurs if the Server breaks the connection

        oSWout.write(packet);
        oSWout.flush();
    }
    catch (IOException e)
    {
        ...
    }
}

public void stopConnection()
{
    try
    {
        oSWout.close();
        connection.disconnect();
    }
    catch (IOException e)
    {
        ...
    }
}

我最终期望的是,当连接到 servlet 时,它会打印“StreamingServlet#doPost(): IN”,然后,对于每个传入的数据包,它应该打印数据字符串,并且在关闭连接时它应该打印“StreamingServlet# doPost(): OUT" 最后从方法返回。

但我想我错过了一些东西,这是在 Java EE 中以另一种方式完成的。我不知道。

4

1 回答 1

2

最后,我自己解决了这个问题:

使用 BufferedReader,所有数据包都被收集(缓冲),并在连接关闭时作为一个包被读取和打印。所以我不得不使用 ServletInputStream [由 HttpServletRequest#getInputStream() 获得] 并使用 read() 方法将数据包读入字节数组。现在一切都按我的预期工作。

但我仍然想知道,使用阻塞操作是否是一个或多或少典型的场景,因此在 doPost() 方法中保持很长时间(比如几分钟或几小时),或者服务器是否以某种方式期望在更短的时间内响应.

于 2012-07-16T13:03:36.880 回答