2015-03-19 73 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