Почему связь с сокетом TCP замедляется? - PullRequest
0 голосов
/ 09 ноября 2019

Я кодировал клиент-сервер-клиент GAME через TCP-сокеты. Связь работает через этот сериализованный класс:

private static final long serialVersionUID = 8412015884579218320L;
private Object firstParam;  
private Object secondParam; 
private ArrayList<?> thirdParam;
private boolean result;

//and then public setters and getters.

Я обнаружил, что, когда сервер и клиент всегда обмениваются пакетами, созданными с одинаковыми значениями, объект записи на serverSide становится медленнее. Создание, запись и чтение объектов на clientSide и serverSide:

Socket socket = new Socket(hostname, port);
writer = new ObjectOutputStream(socket.getOutputStream());
...
reader = new ObjectInputStream(socket.getInputStream());

    public synchronized void send(Pacchetto p) throws IOException{
                writer.writeObject(p);
                writer.flush();
                writer.reset();
    } 

Pacchetto msg = (Pacchetto)reader.readObject();

Я записал время записи, очистки и сброса только на serverSide с помощью:

    long startTime = System.currentTimeMillis();

    writer.writeObject(p);
    System.out.println("(1) WRITE took " + (System.currentTimeMillis() - startTime) + " milliseconds");
    writer.flush();
    System.out.println("(2) FLUSH took " + (System.currentTimeMillis() - startTime) + " milliseconds");
    writer.reset();
    System.out.println("(0) RESET took " + (System.currentTimeMillis() - startTime) + " milliseconds");

И послеВ течение долгого времени, пока они обменивались одним и тем же пакетом, я узнал вот что:

https://pastebin.com/XZsW7BXF

Как видно из этого журнала, в начале и в конце время нормальноепотому что не всегда был один и тот же пакет в сообщении, но в середине журнала увеличивается только время записи, начиная с 0 миллисекунд до 300 и даже более 300, если соединение продолжится. Я думаю, что размер пакета примерно одинаков, потому что он создается всегда одинаково, но есть ли способ правильно проверить размер пакета? Или коммуникация становится медленнее из-за какой-либо ошибки в коде?

PS: Связь на локальном хосте

РЕДАКТИРОВАТЬ: Проводя дальнейшее исследование пакетов, я обнаружил, что в то время как время записи уходитмедленнее, размер пакета всегда одинаков. Журнал: https://pastebin.com/C43pkdtb Я измерил это с помощью:

public static int sizeof(Object obj) throws IOException {

ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);

objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();

return byteOutputStream.toByteArray().length;

}

...