https://www.nuget.org/packages/ObjectDeliverer/
Для установки с помощью NuGet просто установите пакет ObjectDeliverer:
Install-Package ObjectDeliverer
ObjectDeliverer — это библиотека передачи/приёма данных для C#.
Это одноименная родственная библиотека для UE4.
https://github.com/ayumax/ObjectDeliverer
Он имеет следующие особенности.
Следующие протоколы могут использоваться со встроенным. Вы также можете добавить свой собственный протокол.
Следующие правила доступны для встроенных правил разделения передаваемых и полученных данных.
Фиксированный размер
Пример) В случае фиксированных 1024 байт
Заголовок (BodySize) + Тело
Пример) Когда размер области составляет 4 байта.
Разделить по символу терминала
Пример) Когда 0x00 — это конец
Создайте ObjectDelivererManager и создайте различные пути связи, передав «Протокол связи», «Правило разделения пакетов» и «Метод сериализации» в аргументы метода StartAsync.
// Create an ObjectDelivererManager
var deliverer = new ObjectDelivererManager < string > ( ) ;
// Watching for connection events
deliverer . Connected . Subscribe ( async x =>
{
Console . WriteLine ( "connected" ) ;
// Sending data to a connected party
await deliverer . SendAsync ( new byte [ ] { 0x00 , 0x12 } ) ;
await deliverer . SendAsync ( new byte [ ] { 0x00 , 0x12 , 0x23 } ) ;
} ) ;
// Watching for disconnection events
deliverer . Disconnected . Subscribe ( x => Console . WriteLine ( "disconnected" ) ) ;
// Watching for incoming events
deliverer . ReceiveData . Subscribe ( x =>
{
Console . WriteLine ( $ "received buffer length = { x . Buffer . Length } " ) ;
Console . WriteLine ( $ "received message = { x . Message } " ) ;
} ) ;
// Start the ObjectDelivererManager
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ,
new DeliveryBoxString ( ) ) ;
Вы можете переключиться на различные протоколы связи, изменив протокол, переданный методу StartAsync.
// TCP/IP Client
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
// TCP/IP Server
await deliverer . StartAsync (
new ProtocolTcpIpServer ( ) { ListenPort = 9013 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
// UDP Sender
await deliverer . StartAsync (
new ProtocolUdpSocketSender ( ) { DestinationIpAddress = "127.0.0.1" , DestinationPort = 9013 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
// UDP Receiver
await deliverer . StartAsync (
new ProtocolUdpSocketReceiver ( ) { BoundPort = 9013 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
// SharedMemory
await deliverer . StartAsync (
new ProtocolSharedMemory ( ) { SharedMemoryName = "SharedMemory" , SharedMemorySize = 1024 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
// Log File Writer
await deliverer . StartAsync (
new ProtocolLogWriter ( ) { FilePath = @"C:logcomlog.txt" } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
// Log File Reader
await deliverer . StartAsync (
new ProtocolLogReader ( ) { FilePath = @"C:logcomlog.txt" } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
Вы можете легко изменить правило разделения пакетов.
// FixedSize
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ) ;
// Header(BodySize) + Body
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleSizeBody ( ) { SizeLength = 4 , SizeBufferEndian = ECNBufferEndian . Big } ) ;
// Split by terminal symbol
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleTerminate ( ) { Terminate = new byte [ ] { 0xFE , 0xFF } } ) ;
// Nodivision
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleNodivision ( ) ) ;
Использование DeliveryBox позволяет отправлять и получать недвоичные данные (строки символов и объекты).
// UTF-8 string
var deliverer = new ObjectDelivererManager < string > ( ) ;
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleFixedLength ( ) { FixedSize = 10 } ,
new DeliveryBoxString ( ) ) ;
deliverer . ReceiveData . Subscribe ( x => Console . WriteLine ( x . Message ) ) ;
await deliverer . SendMessageAsync ( "ABCDEFG" ) ;
// Object
public class SampleObj
{
public int Prop { get ; set ; }
public string StringProp { get ; set ; }
public string Hoge ( ) => $ " { Prop } _ { StringProp } " ;
}
var deliverer = new ObjectDelivererManager < SampleObj > ( ) ;
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleSizeBody ( ) { SizeLength = 4 , SizeBufferEndian = ECNBufferEndian . Big } ,
new DeliveryBoxObjectJson < SampleObj > ( ) ) ;
deliverer . ReceiveData . Subscribe ( x => Console . WriteLine ( x . Message . Hoge ( ) ) ) ;
var sampleObj = new SampleObj ( ) { Prop = 1 , StringProp = "abc" } ;
await deliverer . SendMessageAsync ( sampleObj ) ;
Вы можете создать DeliveryBox с помощью собственного метода сериализации.
Пример) При применении сериализатора с использованием MessagePack (https://github.com/neuecc/MessagePack-CSharp)
[ MessagePackObject ]
public class SampleObj2
{
[ Key ( 0 ) ]
public int Prop { get ; set ; }
[ Key ( 1 ) ]
public string StringProp { get ; set ; }
public string Hoge ( ) => $ " { Prop } _ { StringProp } " ;
}
// Definition of DeliveryBox using MessagePack
public class ObjectDeliveryBoxUsingMessagePack < T > : IDeliveryBox < T >
{
public override ReadOnlyMemory < byte > MakeSendBuffer ( T message ) => MessagePackSerializer . Serialize ( message ) ;
public override T BufferToMessage ( ReadOnlyMemory < byte > buffer ) => MessagePackSerializer . Deserialize < T > ( buffer ) ;
}
var deliverer = new ObjectDelivererManager < SampleObj2 > ( ) ;
await deliverer . StartAsync (
new ProtocolTcpIpClient ( ) { IpAddress = "127.0.0.1" , Port = 9013 } ,
new PacketRuleSizeBody ( ) { SizeLength = 4 , SizeBufferEndian = ECNBufferEndian . Big } ,
new ObjectDeliveryBoxUsingMessagePack < SampleObj2 > ( ) ) ;
deliverer . ReceiveData . Subscribe ( x => Console . WriteLine ( x . Message . Hoge ( ) ) ) ;
var sampleObj = new SampleObj2 ( ) { Prop = 1 , StringProp = "abc" } ;
await deliverer . SendMessageAsync ( sampleObj ) ;