Skip to content

Repository files navigation

SuperSocket.MessagePack

buildNuGet VersionNuGet Downloads

SuperSocket integration library providing efficient binary serialization and deserialization for network messages using MessagePack with cross-platform and cross-language compatibility.

Features

  • 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

Installation

dotnet add package SuperSocket.MessagePack

Components

MessagePackTypeRegistry

A 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));

MessagePackPipelineFilter

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

Registering the Pipeline Filter (Recommended Approach)

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.

MessagePackPackageEncoder

Provides encoding functionality for MessagePack messages, transforming them into network-ready binary packets with proper header information.

MessagePackPackageDecoder

Provides decoding functionality for binary data into MessagePack objects based on the type identifier in the message header.

Usage Example

Server-side Setup

// 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();

Client-side Setup

// 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();}

Implementing Custom Encoders and Decoders

Custom Encoder Example

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

Custom Decoder Example

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

License

This project is licensed under the terms of the LICENSE file included in this repository.

Related Projects

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages