Миграция протокола
This commit is contained in:
163
src/main/java/io/orprotocol/client/Client.java
Normal file
163
src/main/java/io/orprotocol/client/Client.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
31
src/main/java/io/orprotocol/client/ECITag.java
Normal file
31
src/main/java/io/orprotocol/client/ECITag.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user