2012-07-13 92 views
3

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

回答

2

最後,我解決由我自己的問題:

使用的BufferedReader,所有的數據包被收集(緩衝)和被讀出並當所述連接被關閉打印爲一個packege。所以我不得不使用ServletInputStream [由HttpServletRequest#getInputStream()獲取]並使用read()方法將數據包讀入一個字節數組中。現在一切都按我的預期工作。

但是我還是想知道,如果使用阻塞操作或者在doPost()方法中保持很長時間(比如說幾分鐘或幾小時)或者服務器以某種方式期望響應在更短的時間內。

相關問題