TCP 数据接收错误order/lost

TCP Data is received in the wrong order/lost

我的 TCP 数据很少,但足以引起注意、以错误的顺序接收或完全丢失。

例如,我的客户端会发送Log:joehot200;Password,而服务器会收到ehot200;Password

我检查了 TCP - received in wrong order and TCP 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){

    }
}

这是正在处理的数据类型 send/received:

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 开头的数据包。

这里出了什么问题?

我正在从多个线程发送数据,尽管我显然是在同一个线程上接收所有数据。

所以基本上问题是调用此函数的每个函数:

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

}
}

在单独的上下文中调用它,因此它将创建线程本地 DataOutputStream,一旦线程离开 sendData 上下文就会被销毁,实际上多个客户端正在发送多个按顺序到达的 tcp 数据包,但客户端不同步.要解决此问题,您应该做的是在函数外部声明 DataOutputStream 并创建方法 synchronized。这样可以防止多个线程同时执行同一个方法。最后你的代码应该看起来像这样:

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

这应该会处理乱序接收,但您的线程仍然可以乱序调用 sedData 方法(尽管至少它不会交错)。您可能需要一些额外的逻辑来防止这种情况发生。