2015-03-19 4 views
0

Мои данные TCP редко, но достаточно, чтобы они были заметны, получены в неправильном порядке или полностью потеряны.TCP Данные получены в неправильном порядке/потеряны

Например, мой клиент будет отправлять Log:joehot200;Password, и сервер будет получать ehot200;Password

Я проверил TCP - received in wrong order и 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){ 

    } 
} 

Это своего рода данные, которые отправить/получено:

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

+0

Этого действительно не должно быть. Ваш O/S должен заботиться о неподходящих или отсутствующих пакетах для вас. – Alnitak

+0

@ L33TS "Состояние гонки"? – Joehot200

ответ

1

Поэтому в основном проблема заключается в том, что каждая из функций, которая вызывает эту функцию:

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 из строя (хотя по крайней мере, это не будет чередовать). Возможно, вам понадобится дополнительная логика для предотвращения этого.

+0

Я принял этот ответ, потому что он, похоже, решает мою проблему. Большое спасибо вам всем - Ваша помощь очень ценится! – Joehot200

Смежные вопросы