2013-05-05 34 views
0

我正在開發一個Android實時數據應用程序,通過TCP套接字將數據(浮點數和整數)發送到本地子網上的服務器。我面臨的問題是,在同時發送一些數據後,套接字不會再發送任何數據。我調試了應用程序,它顯示數據正在發送,但不會顯示在服務器上。發生這種情況後,如果我關閉了連接,服務器甚至不會收到關於連接已經被終止的通知,它應該根據我的設計模型。與此同時,我在應用程序上發現異常,說它無法寫入損壞的管道。這告訴我問題出在應用程序上,因爲我也使用桌面應用程序進行了測試,並且可以向服務器發送大量數據並將其傳遞。Android客戶端套接字在一段時間後不會發送數據

請注意,我在這裏討論的數據大小爲每個數據包252字節

這是我正在使用的課程。 (這將運行在AsyncTask對象)

public class Network 
{ 
    private Socket handle; 
    public static enum TASK 
    { 
     TASK_CONNECT, TASK_SEND, TASK_CLOSE 
    } 
    public Network() 
    { 

    } 
    public String lastError = ""; 
    public boolean Connect(String host, int port) 
    { 
     try 
     { 
      lastError = "Connecting to server."; 
      handle = new Socket(host, port); 

      handle.setTcpNoDelay(true); //       
      handle.setSendBufferSize(SIZE_OF_PACKET); ///==> These don't seem to help at all 
      handle.setKeepAlive(true); ///       

      return true; 
     }catch(IOException e) 
     { 
      lastError += e.getMessage() != null ? " "+ e.getMessage() : ""; 
      return false; 
     } 
    } 
    private void err(String e){ 
     System.err.println(e); 
    } 

    private boolean SendPacket(byte buffer[]) 
    { 
     OutputStream oStream = null; 
     err("sending: " + buffer.length + " bytes"); 

     try 
     { 
      lastError = "Obtaining output stream."; 
      oStream = handle.getOutputStream(); 

      lastError = "Error sending data."; 
      oStream.write(buffer); 

      oStream.flush(); 

      return true; 
     }catch(Exception e) 
     { 
      lastError += e.getMessage() != null ? " "+ e.getMessage() : ""; 
     } 
     return false; 
    } 

    public void Close() 
    { 
     try{ handle.close(); handle = null; }catch(Exception e){} // swallow exception 
    } 
} 

我這取決於有多少數字有送我的數據在一個循環。我嘗試了谷歌搜索,但沒有找到任何相關的東西。有誰之前經歷過這個嗎?現在讓我生氣了。

編輯:Wireshark顯示未到達桌面應用程序(服務器)的傳入「紅色」數據包請看這張圖片。 enter image description here 你可以看到第幾都萊恩> 0紅色的有0

我認爲這是一次谷歌的接口USB,所以我們可以使用它。至少那應該是我的第一選擇。

+0

順便說一句:.66是電話(客戶端),而.65是筆記本電腦(服務器)。 – TheRealChx101 2013-05-06 01:42:23

+0

將發送緩衝區大小設置爲數據包的大小是徒勞的。你最好離開它,或者增加它超出默認值。如果使用其他SocketTimeoutException套接字獲得任何'IOException',則必須關閉它。 – EJP 2013-05-06 02:00:26

+0

是的。這是在一個不同的類中完成的,它通過調用'{object} .Close()'實例化'Network()'類。當每個網絡方法返回時,我檢查返回的值(true/false),然後關閉套接字,具體取決於我調用的方法(例如,自從打開套接字之前的SendPacket()) – TheRealChx101 2013-05-06 02:07:59

回答

0

如果您在刷新流後沒有調用oStream.close(),因爲您再也不使用它了?

此外,您說這是在AsyncTask對象中運行。多線程可能試圖同時發送數據包嗎?如果是這樣,您可能需要在SendPacket方法的某種形式的同步。

+0

我現在不接近我的電腦,但我認爲你只是在這裏點亮一些光。我需要添加某種鎖。另外,我創建的每個AsyncTask都會在AsyncTask.onPostExecute()中銷燬。我忘了你無法拼寫沒有鎖的多線程。我會回來,並可能標記你的答案 – TheRealChx101 2013-05-05 14:57:35

+0

沒有。線程同步也不起作用。因此,掛起後我退出應用程序並關閉Wi-Fi,異常開始顯示。線程實際上最終陷入內存中。我的意思是每個線程在發送數據包後終止。所以我認爲它必須與套接字,它阻止了線程堵塞。 – TheRealChx101 2013-05-06 01:18:49

0

好的。我通過使用UDP來解決問題。謝謝你們。 但我仍然沒有找到問題的根源。

相關問題