Android Java tcp-оболочка для инструментов, в настоящее время поддерживает создание нескольких серверов на одном мобильном устройстве с использованием собственных правил обработки сообщений и подключение одного мобильного устройства к нескольким серверам с использованием собственных правил обработки сообщений.
com.android.tools.build:gradle:7.0.0 или более ранняя версия, добавьте в файл build.gradle проекта:
allprojects {
repositories {
google()
mavenCentral()
//jitpack 仓库
maven { url 'https://jitpack.io' }
}
}
com.android.tools.build:gradle:7.0.0 и выше, добавьте в settings.gradle файла проекта:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
//jitpack 仓库
maven {
url 'https://jitpack.io'
}
}
}
Добавьте в файл build.gradle приложения:
dependencies {
...
//TCP инструменты
implementation 'com.gitee.osard.TcpLib:TcpLib:1.3.0'
//UDP инструменты
implementation 'com.gitee.osard.TcpLib:UdpLib:1.3.0'
//основная коммуникация сообщений
implementation 'org.greenrobot:eventbus:3.3.1'
}
Зарегистрируйте режим отладки в приложении, чтобы можно было записывать больше журналов.
//Настройка режима отладки для TCP-сервиса, запись журналов в режиме отладки.
TcpLibConfig.getInstance()
.setDebugMode(BuildConfig.DEBUG)
//Установка времени хранения данных после отключения соединения, данные будут автоматически очищены, если они не были обработаны в течение этого времени.
.setRetentionTime(30);
- Обработка приёма сообщений
Это простой пример, вы также можете определить обработку с заголовками сообщений, хвостами сообщений и проверкой данных в соответствии с вашими потребностями. Конкретные правила полностью определяются вами. Необходимо реализовать интерфейс TcpBaseDataDispose.
public class DataDispose implements TcpBaseDataDispose {
private final static String TAG = DataDispose.class.getSimpleName();
@Override
public void dispose(ByteQueueList bufferQueue, int servicePort, String clientAddress) {
byte[] b = bufferQueue.copyAndRemove(bufferQueue.size());
//todo 按照解析后的指令分发事件
EventBus.getDefault().post(new TcpServiceReceiveDataEvent(servicePort, clientAddress, new String(b)));
}
}
- Отправка обработки сообщений
Это простой пример, вы также можете определить обработку с заголовками сообщений, хвостами сообщений и проверкой данных в соответствии с вашими потребностями. Конкретные правила полностью определяются вами. Необходимо реализовать интерфейс TcpBaseDataGenerate.
public class DataGenerate implements TcpBaseDataGenerate {
@Override
public byte[] generate(Object content) {
//Только для справки, не рекомендуется, размер буфера составляет 10 КБ, пожалуйста, сделайте чёткое различие между заголовком сообщения и хвостом сообщения, чтобы избежать неполного чтения буфера.
if (content instanceof byte[]) {
return (byte[]) content;
} else if (content instanceof String) {
return ((String) content).getBytes(Charset.forName("UTF-8"));
} else {
return content.toString().getBytes(Charset.forName("UTF-8"));
}
}
}
- Запуск сервера, предоставление номера порта запуска и реализации классов обработки и генерации сообщений
int port = 50000;
TcpLibService.getInstance()
.bindService(port, TcpDataBuilder.builder(DataGenerate.class, DataDispose.class));
- Завершение работы сервера, закрытие указанного номера порта
int port = 50000;
TcpLibService.getInstance().close(port);
1. Запуск и обработка событий на стороне сервера
В любом объекте при создании экземпляра, например, в Activity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
...
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventFun(TcpBaseEvent et) {
``` **Обработка событий на сервере в пакете com.mjsoftking.tcplib.event.service**
//События в пакете com.mjsoftking.tcplib.event.service на стороне сервера
//todo Событие обработки данных сообщения, которое необходимо обработать самостоятельно
if (et instanceof TcpServiceReceiveDataEvent) {
TcpServiceReceiveDataEvent event = (TcpServiceReceiveDataEvent) et;
Log.e(TAG, "Порт сервера: " + event.getServicePort() + ", адрес: " + event.getAddress() + ", полученные данные: " + event.getMessage());
TcpLibService.getInstance().sendMessage(event.getServicePort(), event.getAddress(), "shou dao xiao xi");
}
//todo Успешный запуск службы
else if (et instanceof TcpServiceBindSuccessEvent) {
Log.w(TAG, String.format("Запуск сервера успешен, порт: %d", et.getServicePort()));
}
//todo Неуспешный запуск службы
else if (et instanceof TcpServiceBindFailEvent) {
Log.w(TAG, String.format("Неудачный запуск сервера, порт: %d", et.getServicePort()));
}
//todo Закрытие службы
else if (et instanceof TcpServiceCloseEvent) {
Log.w(TAG, String.format("Сервер закрыт, порт: %d", et.getServicePort()));
}
//todo Подключение клиента
else if (et instanceof TcpClientConnectEvent) {
Log.w(TAG, String.format("Новое подключение клиента, порт сервера: %d, адрес клиента: %s", et.getServicePort(), et.getAddress()));
}
//todo Отключение клиента
else if (et instanceof TcpClientDisconnectEvent) {
Log.w(TAG, String.format("Отключено подключение клиента, порт сервера: %d, адрес клиента: %s", et.getServicePort(), et.getAddress()));
}
//todo Отправка сообщения с сервера
else if (et instanceof TcpServiceSendMessageEvent) {
TcpServiceSendMessageEvent event = (TcpServiceSendMessageEvent) et;
Log.w(TAG, String.format("Отправка сообщения с сервера, порт сервера: %d, адрес клиента: %s, содержимое сообщения: %s", event.getServicePort(), event.getAddress(), event.getContent().toString()));
}
**2. Отправка сообщений с сервера клиенту**
int port = 50000;//порт запуска службы сервера
String address = "127.0.0.1:1233"; //адрес получения события подключения клиента при запуске службы сервера (ip:port)
Object content = "данные";//этот параметр будет передан в реализацию TcpBaseDataGenerate для определения типа данных согласно конкретной бизнес-логике
TcpLibService.getInstance().sendMessage(port, address, content);
**3. Другие API сервера**
TcpLibService предоставляет следующие API:
* Получение информации о том, работает ли служба на указанном порту сервера
boolean isRun(int port){}
* Получение количества онлайн-клиентов для службы на указанном порту, где -1 означает, что служба не запущена, а положительное значение указывает на количество онлайн-клиентов
int getOnlineClientCount(int port){}
* Получение списка онлайн-клиентов службы на указанном порту. Если служба не запущена, возвращается null. В противном случае возвращается список адресов ip:port онлайн-клиентов, который можно использовать для прямой отправки данных на сервер
List<String> getOnlineClient(int port){}
* Закрытие подключений клиентов на указанном порту службы
void closeClient(int port, String address) {}
**6. Использование клиента**
**- Запуск клиента требует указания IP и номера порта, а также реализации классов для обработки и генерации сообщений**
Sting address = "127.0.0.1";
int port = 50000;
TcpLibClient.getInstance()
.connect(address, port ),
TcpDataBuilder.builder(ClientDataGenerate.class, ClientDataDispose.class));
**- Завершение работы клиента требует указания IP и номера порта**
Sting address = "127.0.0.1";
int port = 50000;
TcpLibClient.getInstance()
.close(address, port);
**1. Запуск и обработка событий клиентом**
**При создании экземпляра объекта, например, в activity**
- Регистрация EventBus
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
...
}
- Обработка событий EventBus
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventFun(TcpBaseEvent et) {
//события клиента в пакете com.mjsoftking.tcplib.event.client
//todo Обработка события данных сообщения
if (et instanceof TcpClientReceiveDataEvent) {
TcpClientReceiveDataEvent event = (TcpClientReceiveDataEvent) et;
Log.w(TAG, "Порт службы: " + event.getServicePort() + ", адрес службы: " + event.getAddress() + ", получено данных: " + event.getMessage());
}
//todo Соединение успешно установлено
else if (et instanceof TcpServiceConnectSuccessEvent) {
Log.w(TAG, "Соединение успешно установлено, порт службы: " + et.getServicePort() + ", адрес службы: " + et.getAddress());
}
//todo Неудачное соединение
else if (et instanceof TcpServiceConnectFailEvent) {
Log.w(TAG, "Неудачная попытка соединения, порт службы: " + et.getServicePort() + ", адрес службы: " + et.getAddress());
}
//todo Соединение закрыто
else if (et instanceof TcpServiceDisconnectEvent) {
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )