SuperSocket integration library providing efficient binary serialization and deserialization for network messages using MessagePack with cross-platform and cross-language compatibility.
- Efficient binary serialization/deserialization for SuperSocket using MessagePack
- Type-based message routing with centralized type registry
- Clean separation between encoding and decoding logic
- Support for multiple .NET target frameworks
- Cross-platform and cross-language compatibility
dotnet add package SuperSocket.MessagePackA centralized registry for MessagePack message types and their type identifiers. This registry can be shared between encoders, decoders, clients, and servers.
// Create a type registryvartypeRegistry=newMessagePackTypeRegistry();// Register message types with their type IDstypeRegistry.RegisterMessageType(1,typeof(LoginRequest));typeRegistry.RegisterMessageType(2,typeof(LoginResponse));typeRegistry.RegisterMessageType(3,typeof(LogoutRequest));Pipeline filter for handling MessagePack messages with fixed-length headers. The filter expects an 8-byte header consisting of:
- First 4 bytes: Message size in big-endian format
- Next 4 bytes: Message type ID in big-endian format
The recommended way to register the MessagePackPipelineFilter is using dependency injection:
// Create server buildervarserver=SuperSocketHostBuilder.Create<YourPackageInfo>()// Register your custom package decoder.UsePackageDecoder<YourMessagePackDecoder>()// Register the pipeline filter by type.UsePipelineFilter<MessagePackPipelineFilter<YourPackageInfo>>()// Register required services.ConfigureServices((ctx,services)=>{// Register the type registryservices.AddSingleton<MessagePackTypeRegistry>(registry);// Register other required services}).BuildAsServer();This approach uses dependency injection to create and manage the pipeline filter, which makes testing easier and keeps your code more maintainable.
Provides encoding functionality for MessagePack messages, transforming them into network-ready binary packets with proper header information.
Provides decoding functionality for binary data into MessagePack objects based on the type identifier in the message header.
// Create a type registryvarregistry=newMessagePackTypeRegistry();// Register your message typesregistry.RegisterMessageType(1,typeof(LoginRequest));registry.RegisterMessageType(2,typeof(LoginResponse));// Add more message types as needed...// Configure SuperSocket servervarserver=SuperSocketHostBuilder.Create<YourPackageInfo>()// Register package decoder by type.UsePackageDecoder<YourMessagePackDecoder>()// Register pipeline filter by type.UsePipelineFilter<MessagePackPipelineFilter<YourPackageInfo>>()// Register session and package handlers.UseSessionHandler(OnSessionConnected,OnSessionClosed).UsePackageHandler<YourPackageInfo>(async(session,package)=>{// Handle incoming messagesvarencoder=session.Server.ServiceProvider.GetRequiredService<IPackageEncoder<ResponseMessage>>();awaitsession.SendAsync(encoder,newResponseMessage()).ConfigureAwait(false);})// Configure server options.ConfigureSuperSocket(options =>{options.Name="MessagePack Server";options.Listeners=newList<ListenOptions>{newListenOptions{Ip="127.0.0.1",Port=5000}};})// Register services.ConfigureServices((ctx,services)=>{// Register type registryservices.AddSingleton<MessagePackTypeRegistry>(registry);// Register message encoderservices.AddSingleton<IPackageEncoder<ResponseMessage>,YourMessagePackEncoder>();}).BuildAsServer();awaitserver.StartAsync();// Use the same type registry as the servervarregistry=newMessagePackTypeRegistry();registry.RegisterMessageType(1,typeof(LoginRequest));registry.RegisterMessageType(2,typeof(LoginResponse));// Add more message types as needed...// Create encoder and decoder instancesvarencoder=newYourMessagePackEncoder(registry);vardecoder=newYourMessagePackDecoder(registry);// Create client filter and configure clientvarclientFilter=newMessagePackPipelineFilter<YourPackageInfo>(decoder);varclient=newEasyClient<YourPackageInfo>(clientFilter){Security=newSecurityOptions{TargetHost="localhost"}}.AsClient();// Connect to servervarconnected=awaitclient.ConnectAsync(newIPEndPoint(IPAddress.Loopback,5000));if(connected){// Create and send a messagevarloginRequest=newLoginRequest{Username="user",Password="pwd"};awaitclient.SendAsync(encoder,loginRequest);// Receive and process responsevarresponse=awaitclient.ReceiveAsync();Console.WriteLine($"Received response of type: {response.TypeId}");// Close connection when doneawaitclient.CloseAsync();}publicclassYourMessagePackEncoder:MessagePackPackageEncoder<YourPackageInfo>{publicYourMessagePackEncoder(MessagePackTypeRegistrytypeRegistry):base(typeRegistry){}protectedoverrideobjectGetMessagePackObject(YourPackageInfopackage){// Extract the actual message object from your packagereturnpackage.Message;}protectedoverrideintGetMessagePackMessageTypeId(YourPackageInfopackage){// Get the type ID from your packagereturnpackage.TypeId;}}publicclassYourMessagePackDecoder:MessagePackPackageDecoder<YourPackageInfo>{publicYourMessagePackDecoder(MessagePackTypeRegistrytypeRegistry):base(typeRegistry){}protectedoverrideYourPackageInfoCreatePackageInfo(objectmessage,TypemessageType,inttypeId){// Create your package instance from the decoded messagereturnnewYourPackageInfo{Message=message,MessageType=messageType,TypeId=typeId};}}This project is licensed under the terms of the LICENSE file included in this repository.