Что такое prototransl
Prototransl — это сокращение от «protocol translate», что в переводе с английского означает «преобразование протокола». Prototransl представляет собой инструмент для обработки сообщений через сокеты, который обеспечивает упаковку и распаковку данных, а также обеспечивает безопасность. Он может автоматически сопоставлять данные с логической обработкой через аннотации. Инструмент подходит для работы с WebSocket, TCP и UDP.
В контексте передачи сообщений каждый тип сообщения называется протоколом. Поскольку существуют протоколы, необходимо выполнять их распаковку и упаковку, что не имеет смысла для разработчиков. Prototransl решает эту проблему, автоматически выполняя распаковку и упаковку данных на основе определённого пользователем протокола.
Поскольку сообщения могут быть перехвачены и расшифрованы злоумышленниками, prototransl выполняет индивидуальную упаковку каждого поля сообщения, обеспечивая безопасность передачи данных, если только код приложения не является открытым.
Пример использования
Приведён пример разработки TCP-сервера на основе Apache Mina и prototransl. Также упоминается версия prototransl для JavaScript.
Предисловие
Некоторые параметры конфигурации по умолчанию можно настроить в файле prototransl.properties.
Сообщения протокола
Обработка сообщений через сокет включает распаковку и упаковку сообщений протокола (Protocol). Логическая обработка определяется автоматически на основе информации из заголовка сообщения (ProtocolService). Инструмент поддерживает следующие типы данных: Uint8, Uint16, Uint32 и Uint64, а также строки, целые числа, короткие целые числа, длинные целые числа и логические значения в Java.
Контейнеры
Инструмент предоставляет встроенные контейнеры, которые позволяют выполнять операции через интерфейс Cr. Доступ к контейнеру можно получить через метод transl.getIoc. По умолчанию используется одноэлементный режим.
Аннотации
@Protocol
Эта аннотация указывает, что класс является классом протокола, где mType — уникальный идентификатор протокола. Пример использования:
@Protocol(mType = 1)
public class User {
private String name;
private Uint32 phone;
//опущены геттеры и сеттеры
}
Или во внутреннем классе:
public class User {
@Protocol(mType = 1)
public static class User2{
private Uint8 ret;
}
}
@ProtocolService
Указывает, что класс содержит логику обработки. Пример:
@com.prototransl.annotation.ProtocolService
public class ProtocolService {
//методы логической обработки
}
@Itinerary
Определяет конкретный метод логической обработки, соответствующий протоколу mType, и принимает параметр типа Protocol. Пример:
@com.prototransl.annotation.ProtocolService
public class ProtocolService {
@Itinerary(mType=1)
public void proto1(User user){
System.out.println(user.getName());
System.out.println(user.getPhone());
}
}
Буфер
Встроенный буфер ProtoBuffer основан на ByteBuffer в Java. Каждое полученное сообщение должно быть добавлено в буфер. Если вы работаете с сервером, рекомендуется использовать отдельный буфер для каждого пользователя.
Быстрый старт
Для начала работы с prototransl необходимо выполнить следующие шаги:
Добавить репозиторий проекта в Maven:
<repositories>
<repository>
<id>lamkeizyi-repo</id>
<url>https://raw.githubusercontent.com/AlexJialene/maven-repo/master/repository</url>
</repository>
</repositories>
Загрузить необходимые пакеты:
<dependency>
<groupId>prototransl</groupId>
<artifactId>com.prototransl</artifactId>
<version>1.0-beta-3</version>
</dependency>
Настроить файл prototransl.properties:
prototransl.basePackage=com.prototransl //сохранить параметр
prototransl.protocol.servicePackage=com.model //пакет класса логической обработки
prototransl.protocol.protocolPackage=com.model //пакет класса протокола
prototransl.scan.recursively=true //сканировать ли пакеты рекурсивно
prototransl.pack.capacity=1024 //максимальная ёмкость при упаковке
prototransl.buffer.littleEndian=false //порядок байтов при записи в буфер (по умолчанию false)
prototransl.port=9876 //сохранить параметр
Запустить приложение:
Transl transl = Transl.transl();
transl.initialize();
Принять сообщение:
Transl transl = Transl.transl();
byte[] b = ...;
ProtoBuffer protoBuffer = new ProtoBuffer();
protoBuffer.addBuff(b);
//обработать полученное сообщение, после успешной проверки на соответствие протоколу автоматически вызывается метод логической обработки
transl.createProtocolApp().receive(protoBuffer);
Упаковать данные:
Transl transl = Transl.transl();
//передать объект протокола для получения массива байтов
byte[] b = transl.createProtocolApp().pack(user);
Продвинутое использование
Здесь описывается расширенное использование prototransl, включая использование классов Uint.
Классы Uint представляют собой серию классов, которые могут заменить стандартные типы Java, такие как Integer, Short, Long и Boolean. Рекомендуется использовать классы Uint вместо стандартных типов Java для повышения эффективности, особенно при распаковке сообщений.
Поддерживаются следующие типы Java и соответствующие им классы Uint:
Тип Java | Класс Uint |
---|---|
Integer | Uint32 |
Short | Uint16 |
Long | Uint64 |
Boolean | Uint8 |
String | — |
Uint8 занимает 1 байт, Uint16 — 2 байта, Uint32 — 4 байта, а Uint64 — 8 байтов. Вы можете выбрать подходящий класс Uint в зависимости от ваших потребностей.
Пример использования:
@Protocol(mType = 1)
public class User {
private String name;
private Uint32 phone;
private Uint8 sex;
private Uint16 field1;
private Uint64 field2;
//геттеры и сеттеры опущены
}
Также доступны интерфейсы PackProtocol и UnpackProtocol, которые предоставляют дополнительную гибкость и контроль над процессом упаковки и распаковки данных. Однако использование этих интерфейсов требует дополнительной логики и может повлиять на порядок полей в сообщении. ``` // Игнорируем метод конструирования @Override public boolean unpackProto(Unpack proto) { this.ret = proto.popUint8(); this.phone = proto.popUint32(); return true; } }
2. Pack
@Protocol(mType = 2) public class User2 implements PackProtocol{ private Uint8 ret; private Uint32 phone; // Игнорируем метод конструирования @Override public void packProto(Pack proto) { proto.push(ret); proto.push(phone); } }
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )