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

OSCHINA-MIRROR/int2e-HPSocket.Net

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 8.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 08:53 341277d

Привязка события OnEasyMessageData

{
    // The data parameter is a complete packet each time
    // ... Обрабатываем данные

    return HttpParseResult.Ok;
};
}

IHttpEasyAgent

// Создаём экземпляр IHttpEasyAgent
using(IHttpEasyAgent httpAgent = new HttpEasyAgent())
{
    // ... Другие настройки

    // Привязка события OnEasyMessageData
    httpAgent.OnEasyMessageData += (sender, id, data) => 
    {
        // Параметр data — это полный пакет каждый раз
        // ... Обрабатываем данные

        return HttpParseResult.Ok;
    };
}

IHttpEasyClient

// Создаём экземпляр IHttpEasyClient
using(IHttpEasyClient httpClient = new HttpEasyClient())
{
    // ... Другие настройки

    // Привязка события OnEasyMessageData
    httpClient.OnEasyMessageData += (sender, data) => 
    {
        // Параметр data — это полный пакет каждый раз
        // ... Обрабатываем данные

        return HttpParseResult.Ok;
    };
}

Компонент адаптера приёма данных

Полный пример: demo/TcpServer-TestEcho-Adapter

Эта серия компонентов представляет собой компоненты расширения Data Receive Adapter для HPSocket.Net. Пользователи могут обрабатывать «липкие пакеты», «полупакеты» и т. д., которые могут возникать при TCP-соединении через Custom Data Receive Adapter. Компонент Data Receive Adapter похож на компонент Pack HP-Socket, но он более гибкий, а адаптация очень проста и удобна.

  • ITcpServer<TRequestBodyType>/ITcpClient<TRequestBodyType>/ITcpAgent<TRequestBodyType>
  • ISslServer<TRequestBodyType>/ISslClient<TRequestBodyType>/ISslAgent<TRequestBodyType>

Объект универсального типа <TRequestBodyType> будет вызываться обратно в событии OnParseRequestBody перечисленных выше компонентов.

using (ITcpServer<byte[]> server = new TcpServer<byte[]>)
{
    // Указываем адаптер приёма данных
    DataReceiveAdapter = new BinaryDataReceiveAdapter(),
})
{
    // Нет необходимости привязывать событие OnReceive
    // Данные события тела запроса, проанализированные здесь, являются данными, возвращаемыми BinaryDataReceiveAdapter.ParseRequestBody()
    // Тип данных — byte[], указанный при создании экземпляра ITcpServer <byte[]>
    server.OnParseRequestBody += (sender, id, data) =>
    {
        Console.WriteLine($"OnParseRequestBody({id}) -> data length: {data.Length}");

        return HandleResult.Ok;
    };
}

В настоящее время поддерживаются 4 адаптера.

1. Адаптер приёма фиксированных данных FixedHeaderDataReceiveAdapter

Сценарий использования: длина заголовка данных пакета фиксирована, и заголовок содержит длину тела.

Пример: первые 4 байта определяют длину тела (в порядке прямого порядка байтов). 0x00000003 указывает, что длина тела составляет 3 байта, а {0x61, 0x62, 0x63} — тело.

{ 0x03, 0x00, 0x00, 0x00, 0x61, 0x62, 0x63 }

FixedHeaderDataReceiveAdapter предназначен для этой структуры.

Подклассы наследуют FixedHeaderDataReceiveAdapter. Вызывают конструктор родительского класса в своём собственном конструкторе, передавая длину заголовка и максимально допустимую длину пакета. Переопределяют метод GetBodySize(), параметр длины его заголовка — длина заголовка, указанная в конструкторе, пользователь должен проанализировать этот параметр и вернуть фактическую длину тела. Переопределяют метод ParseRequestBody() для десериализации текущих байтов в объект универсального типа (<TRequestBodyType>). 4. Междуначный адаптер получения данных

И заголовок, и конец пакета имеют характерный символ. Этот адаптер использует эту особенность.

Пример: заголовок пакета начинается с определённого характерного символа, а хвост пакета заканчивается другим характерным символом.

##hello world!## // начинается с ##, заканчивается ##

ИЛИ

##hello world!|| // начинается с ##, заканчивается ||

ИЛИ

**hello world!|##| // начинается с **, заканчивается |##|

Междуначный адаптер получения данных разработан для этой структуры.

using System.Text;
using HPSocket.Adapter;

namespace TcpServerTestEchoAdapter.DataReceiveAdapter
{
    /// <summary>
    /// Междуначный адаптер получения данных
    /// </summary>
    public class HeadTailDataReceiveAdapter : BetweenAndDataReceiveAdapter<string>
    {
        /// <summary>
        /// Вызов конструктора родительского класса с указанием начального и конечного характерных символов раздела
        /// </summary>
        public HeadTailDataReceiveAdapter() 
            : base( // Например, формат данных — «#* 123456 *#», который начинается с #* и заканчивается *#, а средняя часть 123456 — это реальные данные
                start : Encoding.UTF8.GetBytes("#*"),  // Идентификатор начала раздела, здесь начинается с #*, обратите внимание на проблемы с кодировкой и согласованность обеих сторон
                end : Encoding.UTF8.GetCodes("*#")  // Идентификатор конца раздела, здесь заканчивается *#, обратите внимание на проблемы с кодировкой и согласованность обеих сторон
                )
        {
        }

        /// <summary>
        /// Разбор тела запроса
        /// <remarks>Подклассы должны переопределить этот метод</remarks>
        /// </summary>
        /// <param name="data">Данные, которые не были обработаны идентификатором символа родительского класса</param>
        /// <returns></returns>
        protected override string ParseRequestBody(byte[] data)
        {
            // Преобразование в объект запроса, обратите внимание на кодировку символов, обе стороны должны быть согласованы.
            return Encoding.UTF8.GetString(data);
        }
    }
}

Внести свой вклад

  1. Создайте форк этого репозитория.
  2. Создайте новую ветку Feat_xxx.
  3. Отправьте код.
  4. Создайте новый запрос на вытягивание.
1
https://api.gitlife.ru/oschina-mirror/int2e-HPSocket.Net.git
git@api.gitlife.ru:oschina-mirror/int2e-HPSocket.Net.git
oschina-mirror
int2e-HPSocket.Net
int2e-HPSocket.Net
develop