Чистая управляемая реализация спецификации Netcode.IO на C#.
Цель этого проекта — предоставить чистую управляемую реализацию спецификации Netcode.IO, закодированную на основе .NET 3.5 и не использующую собственные библиотеки DLL или оболочки для максимальной переносимости. Вместо использования libsodium, как в исходной эталонной реализации C, в этой реализации используется настроенная версия криптографической библиотеки Bouncy Castle. Вы можете найти исходный код здесь: https://github.com/bcgit/bc-csharp.
Кроме того, он предназначен для использования в играх. С этой целью он был разработан с нуля так, чтобы оказывать минимальное влияние на распределение GC. По большей части вы вообще не увидите никакого влияния GC от использования Netcode.IO.NET.
Большая часть API находится в пространстве имен NetcodeIO.NET
Чтобы создать и запустить новый сервер:
Server server = new Server (
maxClients , // int maximum number of clients which can connect to this server at one time
publicAddress , port , // string public address and int port clients will connect to
protocolID , // ulong protocol ID shared between clients and server
privateKeyBytes // byte[32] private crypto key shared between backend servers
) ;
server . Start ( ) ; // start the server running
Чтобы прослушать различные события:
// Called when a client has connected
server . OnClientConnected += clientConnectedHandler ; // void( RemoteClient client )
// Called when a client disconnects
server . OnClientDisconnected += clientDisconnectedHandler ; // void( RemoteClient client )
// Called when a payload has been received from a client
// Note that you should not keep a reference to the payload, as it will be returned to a pool after this call completes.
server . OnClientMessageRecieved += messageReceivedHandler ; // void( RemoteClient client, byte[] payload, int payloadSize )
// Called when the server logs a message
// If you are not using a custom logger, a handler using Console.Write() is sufficient.
server . OnLogMessage += logMessageHandler ; // void( string message, NetcodeLogLevel logLevel )
Чтобы отправить полезную нагрузку удаленному клиенту, подключенному к серверу:
remoteClient . Send ( byte [ ] payload , int payloadSize ) ;
// or:
server . SendPayload ( RemoteClient client , byte [ ] payload , int payloadSize ) ;
Чтобы отключить клиента:
server . Disconnect ( RemoteClient client ) ;
Чтобы получить произвольные 256-байтовые пользовательские данные, которые можно передать с помощью токена подключения:
remoteClient . UserData ; // byte[256]
Чтобы остановить сервер и отключить всех клиентов:
server . Stop ( ) ;
Чтобы создать нового клиента:
Client client = new Client ( ) ;
Чтобы прослушать различные события:
// Called when the client's state has changed
// Use this to detect when a client has connected to a server, or has been disconnected from a server, or connection times out, etc.
client . OnStateChanged += clientStateChanged ; // void( ClientState state )
// Called when a payload has been received from the server
// Note that you should not keep a reference to the payload, as it will be returned to a pool after this call completes.
client . OnMessageReceived += messageReceivedHandler ; // void( byte[] payload, int payloadSize )
Чтобы подключиться к серверу с помощью токена подключения:
client . Connect ( connectToken ) ; // byte[2048] public connect token as returned by a TokenFactory
Чтобы отправить сообщение на сервер при подключении:
client . Send ( byte [ ] payload , int payloadSize ) ;
Чтобы отключить клиента:
client . Disconnect ( ) ;
TokenFactory можно использовать для создания токенов общедоступного подключения, используемых клиентами для подключения к игровым серверам. Чтобы создать новую TokenFactory:
TokenFactory tokenFactory = new TokenFactory (
protocolID , // must be the same protocol ID as passed to both client and server constructors
privateKey // byte[32], must be the same as the private key passed to the Server constructor
) ;
Чтобы создать новый 2048-байтовый токен общедоступного подключения:
tokenFactory . GenerateConnectToken (
addressList , // IPEndPoint[] list of addresses the client can connect to. Must have at least one and no more than 32.
expirySeconds , // in how many seconds will the token expire
serverTimeout , // how long it takes until a connection attempt times out and the client tries the next server.
sequenceNumber , // ulong token sequence number used to uniquely identify a connect token.
clientID , // ulong ID used to uniquely identify this client
userData // byte[], up to 256 bytes of arbitrary user data (available to the server as RemoteClient.UserData)
) ;
Netcode.IO.NET — это чистый порт протокола Netcode.IO — не больше и не меньше. По своей сути Netcode.IO представляет собой абстракцию, основанную на шифровании и соединении поверх UDP. И, как и UDP, он не имеет никаких гарантий надежности. Ваши сообщения могут не попасть в него, и они могут прийти не по порядку. Это просто факт Интернета. Тем не менее, любой игре почти наверняка понадобится какой-то уровень надежности. С этой целью мой проект ReliableNetcode.NET предоставляет независимый и простой в использовании уровень надежности, который вы можете использовать для добавления этой функциональности в свою игру.