Миграция протокола

This commit is contained in:
RoyceDa
2026-02-02 05:30:38 +02:00
parent a05501fb80
commit bbc83c7d39
17 changed files with 36 additions and 32 deletions

View File

@@ -0,0 +1,163 @@
package io.orprotocol.client;
import java.util.HashSet;
import java.util.Set;
import org.java_websocket.WebSocket;
import io.orprotocol.BaseFailures;
import io.orprotocol.ServerFailures;
import io.orprotocol.util.StringUtil;
/**
* Клиент, подключенный к серверу.
*/
public class Client {
public WebSocket socket;
public String clientId;
/**
* Любые данные, связанные с клиентом.
*/
public Set<ECITag> eciTags;
/**
* Интервал отправки heartbeat пакетов в миллисекундах.
*/
public long heartbeatInterval = 0;
/**
* Время последнего полученного heartbeat в миллисекундах.
*/
private volatile long lastHeartbeatTime;
/**
* Создает нового клиента с указанным сокетом.
* Этот метод используется внутри протокола для управления подключениями клиентов.
* @param socket Веб-сокет клиента.
*
*/
public Client(WebSocket socket, long heartbeatInterval) {
this.socket = socket;
this.clientId = StringUtil.randomString(32);
this.eciTags = new HashSet<ECITag>();
this.heartbeatInterval = heartbeatInterval;
this.lastHeartbeatTime = System.currentTimeMillis();
}
/**
* Проверяет жив ли клиент на основе времени последнего heartbeat.
* Если с момента последнего heartbeat прошло больше, чем указанный интервал, клиент считается неактивным.
*
* Для того чтобы исключить сетевые задержки, проверка умножает интервал на 2.
* @return
*/
public boolean isAlive() {
return (System.currentTimeMillis() - this.lastHeartbeatTime) * 2 <= this.heartbeatInterval * 1000;
}
/**
* Обновляет время последнего полученного heartbeat на текущее время.
*/
public void updateHeartbeat() {
this.lastHeartbeatTime = System.currentTimeMillis();
}
/**
* Получает уникальный идентификатор клиента.
* @return Идентификатор клиента.
*/
public String getClientId() {
return clientId;
}
/**
* Получает данные, связанные с клиентом.
* @return Данные клиента.
*/
public Set<ECITag> getEciTags() {
return this.eciTags;
}
/**
* Устанавливает уникальный идентификатор клиента.
* @param clientId Идентификатор клиента.
*/
public void setClientId(String clientId) {
this.clientId = clientId;
}
/**
* Устанавливает данные для клиента по указанному ключу.
* @param key Ключ данных.
* @param value Значение данных.
*/
public <T extends ECITag> void addTag(T eciTag) {
this.eciTags.add(eciTag);
}
/**
* Устанавливает данные клиента.
* @param data Данные клиента.
*/
public void setTags(Set<ECITag> eciTags) {
this.eciTags = eciTags;
}
/**
* Получает данные клиента по указанному ключу.
* @param key Ключ данных.
* @return Значение данных.
*/
public <T extends ECITag> T getTag(ECITag eciTag) {
for (ECITag tag : this.eciTags) {
if (tag.getKey().equals(eciTag.getKey())) {
return (T) tag;
}
}
return null;
}
/**
* Проверяет наличие данных клиента по указанному ключу.
* @param key Ключ данных.
* @return true если данные существуют, иначе false.
*/
public boolean hasTag(ECITag eciTag) {
for (ECITag tag : this.eciTags) {
if (tag.getKey().equals(eciTag.getKey())) {
return true;
}
}
return false;
}
/**
* Получает веб-сокет клиента.
* @return Веб-сокет.
*/
public WebSocket getSocket() {
return socket;
}
/**
* Отключает клиента с указанным кодом.
* @param code Код отключения.
*/
public void disconnect(int code) {
this.socket.close(code);
}
/**
* Отключает клиента с указанным кодом отказа.
* @param code Код отказа.
*/
public void disconnect(BaseFailures code) {
this.disconnect(code.getCode());
}
/**
* Отключает клиента с неизвестной причиной.
*/
public void disconnect() {
this.disconnect(ServerFailures.UNKNOWN_FAILURE);
}
}

View File

@@ -0,0 +1,31 @@
package io.orprotocol.client;
/**
* Embedded Client Information Tag.
*
* Используется для хранения дополнительной информации о клиенте.
*/
public abstract class ECITag {
/**
* Ключ тега.
*/
public String key;
/**
* Создает новый тег с указанным ключом и значением.
* @param key Ключ тега.
*/
public ECITag(String key) {
this.key = key;
}
/**
* Получает ключ тега.
* @return Ключ тега.
*/
public String getKey() {
return this.key;
}
}