我有一个 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 中以另一种方式完成的。我不知道。