Накопление сообщения клиента TCP - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь реализовать клиент TCP , который отправляет серверу каждые 50 мс. Поэтому я разработал программу быстрого тестирования TCP, в которой я могу изменять время между каждым сообщением, и я не получаю сообщение для отправки каждые X мс, и они накапливаются, как вы можете видеть при захвате Wireshark. Есть идеи?

Предполагается, что это только одна буква a и Время, прошедшее с момента, когда предыдущий кадр в этом потоке TCP должно быть близко к значению, введенному консолью в этом примере, 0,08 секунды

enter image description here

public class TCPClient {

static Socket clientSocket;
static DataOutputStream outToServer;
public static class enviar extends TimerTask {
    public void run() {
        try{
            outToServer.writeBytes("a");
            System.out.println("Packet Sent");
        }catch(Exception e){
            System.out.println(e);
        }
    }
}



public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int tiempo = 1000;
    System.out.print("Tiempo: ");
    tiempo = scanner.nextInt();
    try{
        clientSocket = new Socket("192.168.1.21", 1337);
        outToServer = new DataOutputStream(clientSocket.getOutputStream());
    }catch(Exception e){
        System.out.println(e);
    }
    Timer timer = new Timer();
    timer.schedule(new enviar(), 0, tiempo);
}

}

1 Ответ

0 голосов
/ 15 мая 2019

Вы можете повлиять на поведение отправителя, установив опцию сокета «TCP_NODELAY» (местное написание может отличаться), что повышает вероятность того, что байты будут отправлены немедленно (в зависимости от управления потоком и т. Д.), Но это не изменитОсновная природа TCP.

TCP не является протоколом, ориентированным на сообщения, это протокол последовательного потока байтов.Нет никакой гарантии, что отдельное выполнение «send» приводит к тому же числу с тем же содержанием, что и «receive» на другом конце.Это часто случается, особенно в локальных сетях, когда вам не везет, и границы «сообщений», похоже, сохраняются, но это не обязательно так.

Если вам нужны сообщения, вы должны их придумывать.Стандартные методы: сообщения фиксированной длины (звучит так, как будто вы делаете это: длина 1), заголовок с указанием длины, байты-разделители.Приемник должен быть закодирован, чтобы восстановить сообщения.Пакетирование по проводам не имеет значения.

...