2015-03-19 74 views
0

我的TCP數據很少,但足以讓它顯眼,以錯誤順序接收,或完全丟失。TCP數據接收順序錯誤/丟失

例如,我的客戶就送Log:joehot200;Password,並且服務器將收到ehot200;Password

我檢查TCP - received in wrong orderTCP data occasionally received in wrong order and incomplete和沒有幫助。他們都似乎有沒有給出足夠的細節或不解決問題的答案。

我使用這個代碼發送客戶端和服務器上的數據:

public void sendData(String data){ //Server code 
    try{ 
     System.out.println("Sent " + data); 
    DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream()); 
    outToClient.writeBytes(data + "\n"); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void sendData(String data){ //Client code 
    try{ 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     outToServer.writeBytes(data + "\n"); 
    }catch (Exception e){ 

    } 
} 

這是那種正在發送數據/接收:

Data: UID:1;Pitch:0.0 
FROM SERVER: Name:1;joehot200 
Data: Name:1;joehot200 
FROM SERVER: Type:1;2 
Data: Type:1;2 
FROM SERVER: FlaBag:1;0 
Data: FlaBag:1;0 
FROM SERVER: Teall-104,442m:1;1 
Data: Teall-104,442m:1;1 
FROM SERVER: 6.572884235079,51.82797146606425,5670.44316581469,0 

事實上,尋找在上面的數據,即使這是錯誤的!我沒有以FlaBag或Teall開頭的數據包。

這裏怎麼回事?

我從多個線程發送數據,雖然我顯然收到同一線程上的所有數據。

+1

你是否有機會使用多個線程?可能是一種競爭條件。 – Bauss 2015-03-19 10:53:23

+0

這真的不應該發生。您的操作系統應該爲您處理亂序或丟失數據包。 – Alnitak 2015-03-19 10:54:31

+0

@ L33TS「比賽條件」? – Joehot200 2015-03-19 10:54:50

回答

1

所以基本上問題是,每個函數調用此函數:

public void sendData(String data){ //Client code 
try{ 
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    outToServer.writeBytes(data + "\n"); 
}catch (Exception e){ 

} 
} 

調用它在一個單獨的上下文,因此一旦線程離開送出數據,將創建線程局部DataOutputStream類將被銷燬上下文,有效地多個客戶端發送多個tcp數據包按順序到達,但客戶端不同步。爲了解決這個問題,你應該做的是在你的函數之外聲明DataOutputStream,並使方法synchronized。這將防止多個線程同時執行相同的方法。到底你的代碼看起來應該是這樣的:

public class Blaaa { 
    ... 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    public synchronized void sendData(String data) { 
     outToServer.writeBytes(data + "\n"); 
    } 
} 

這應該採取的亂序接收的照顧,但你的線程仍然可以調用sedData方法亂序(雖然它至少不會交錯)。您可能需要一些額外的邏輯來防止這種情況。

+0

我接受了這個答案,因爲它似乎解決了我的問題。非常感謝大家 - 非常感謝您的幫助! – Joehot200 2015-03-19 12:57:31