1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/osard-TcpLib

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

TcpLibApp

Введение

Android Java tcp-оболочка для инструментов, в настоящее время поддерживает создание нескольких серверов на одном мобильном устройстве с использованием собственных правил обработки сообщений и подключение одного мобильного устройства к нескольким серверам с использованием собственных правил обработки сообщений.

Обновления

V1.3.0 (2024-10-15)

  • Изменены обработчики TCP и UDP, передаётся класс типа, а не экземпляр объекта.

V1.2.1 (2024-10-09)

  • Удалены случайные логи в пакете инструментов TCP.

V1.2.0 (2023-09-27)

  • Оптимизирован для пользовательского кэша, что повышает скорость анализа кэша и предотвращает возникновение исключений при изменении коллекции;
  • В конфигурации добавлена настройка верхнего предела размера кэша. Не рекомендуется устанавливать слишком большой размер, размер должен контролироваться в диапазоне от 64 КБ до 128 КБ. Обратите внимание, что скорость анализа кеша не должна быть ниже скорости передачи данных, чтобы избежать переполнения кеша и потери данных;
  • Добавлена группа инструментов UDP.

V1.1.5 (2022-12-05)

  • Метод removeFrameToHeader(byte[] header) удаляет все байты из буфера, соответствующие заданному заголовку, и помещает заголовок в начало буфера;
  • Список буферов наследуется от ArrayList, что ускоряет анализ буфера;
  • Способ отправки данных клиентскими и серверными инструментами был изменён, чтобы предотвратить проблемы с неправильным порядком отправки данных.

V1.1.1 (2022-02-17)

  • Для списка буферов добавлен поток блокировки при записи, чтобы избежать проблем с изменением коллекции.
  • Буферные списки помечаются как удалённые, чтобы избежать неправильного использования методов.

Часть 1: Проект введения

  1. TcpLib — aar-ресурс проекта, который необходимо импортировать. Ресурсы aar уже запросили разрешение на доступ в Интернет. Теперь можно использовать jitpack для импорта.
  2. TcpService — приложение типа APP, демонстрационная программа сервера.
  3. tcpclient — приложение типа APP, клиентская демонстрационная программа.

Часть 2: Импорт пакета инструментов в проект

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'
}

Часть 3: Настройка режима отладки

Зарегистрируйте режим отладки в приложении, чтобы можно было записывать больше журналов.

//Настройка режима отладки для TCP-сервиса, запись журналов в режиме отладки.
TcpLibConfig.getInstance()
        .setDebugMode(BuildConfig.DEBUG)
        //Установка времени хранения данных после отключения соединения, данные будут автоматически очищены, если они не были обработаны в течение этого времени.
        .setRetentionTime(30);

Часть 4: Переписать обработку приёма и отправки сообщений службы

- Обработка приёма сообщений

Это простой пример, вы также можете определить обработку с заголовками сообщений, хвостами сообщений и проверкой данных в соответствии с вашими потребностями. Конкретные правила полностью определяются вами. Необходимо реализовать интерфейс 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"));
        }
    }
}

Часть 5: Использование на стороне сервера

- Запуск сервера, предоставление номера порта запуска и реализации классов обработки и генерации сообщений

int port = 50000;
TcpLibService.getInstance()
                .bindService(port, TcpDataBuilder.builder(DataGenerate.class, DataDispose.class));

- Завершение работы сервера, закрытие указанного номера порта

int port = 50000;
TcpLibService.getInstance().close(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.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 )

Вы можете оставить комментарий после Вход в систему

Введение

Инструмент для инкапсуляции TCP-соединений Java на Android, сервер поддерживает прослушивание нескольких портов на одном мобильном устройстве и использует индивидуальные правила обработки пакетов, клиент поддерживает подключение одного мобильного устройства к нескольким портам сервера и также использует индивидуальные правила обработки пакетов. Развернуть Свернуть
Apache-2.0
Отмена

Обновления (3)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/osard-TcpLib.git
git@api.gitlife.ru:oschina-mirror/osard-TcpLib.git
oschina-mirror
osard-TcpLib
osard-TcpLib
master