Привязка события 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 адаптера.
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);
}
}
}
Внести свой вклад
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.