我正在開發一個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顯示未到達桌面應用程序(服務器)的傳入「紅色」數據包請看這張圖片。 你可以看到第幾都萊恩> 0紅色的有0
我認爲這是一次谷歌的接口USB,所以我們可以使用它。至少那應該是我的第一選擇。
順便說一句:.66是電話(客戶端),而.65是筆記本電腦(服務器)。 – TheRealChx101 2013-05-06 01:42:23
將發送緩衝區大小設置爲數據包的大小是徒勞的。你最好離開它,或者增加它超出默認值。如果使用其他SocketTimeoutException套接字獲得任何'IOException',則必須關閉它。 – EJP 2013-05-06 02:00:26
是的。這是在一個不同的類中完成的,它通過調用'{object} .Close()'實例化'Network()'類。當每個網絡方法返回時,我檢查返回的值(true/false),然後關閉套接字,具體取決於我調用的方法(例如,自從打開套接字之前的SendPacket()) – TheRealChx101 2013-05-06 02:07:59