我有一個Android應用程序連接到服務器,並不斷髮送一些信號數據(使用HttpURLConnection)。在服務器上,當前正在處理該流的腳本(shell或python,並不完全知道,它不是我的一部分),並且爲每個包含數據的包創建一個curl請求,將該包發佈到一個servlet中(運行在Jetty 8 Web容器)。這只是一個預先的解決方案,因爲我不知道如何直接連接和傳輸數據到servlet。作爲一項要求,數據傳輸應使用HTTP協議,以防止任何防火牆阻止。如何將文本數據連續流式傳輸到servlet?
那麼,是否有可能最初連接到一個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應用程序具有使用HttpURLConnection的3種方法:
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中以另一種方式完成的。我不知道。