Я кодировал клиент-сервер-клиент 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;
}