Eine rein verwaltete C#-Implementierung der Netcode.IO-Spezifikation
Das Ziel dieses Projekts besteht darin, eine rein verwaltete Implementierung der Netcode.IO-Spezifikation bereitzustellen, die für .NET 3.5 codiert ist und für maximale Portabilität keine nativen DLLs oder Wrapper verwendet. Anstatt libsodium wie die ursprüngliche C-Referenzimplementierung zu verwenden, verwendet diese Implementierung eine angepasste Version der Bouncy Castle-Kryptografiebibliothek. Den Original-Quellcode finden Sie hier: https://github.com/bcgit/bc-csharp
Darüber hinaus ist es für den Einsatz in Spielen konzipiert. Zu diesem Zweck wurde es von Grund auf so konzipiert, dass es möglichst geringe Auswirkungen auf die GC-Zuteilungen hat. Im Großen und Ganzen sollten Sie durch die Verwendung von Netcode.IO.NET überhaupt keine GC-Auswirkungen feststellen.
Der Großteil der API befindet sich im Namespace NetcodeIO.NET
So erstellen und starten Sie einen neuen Server:
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
Um verschiedene Ereignisse anzuhören:
// 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 )
So senden Sie eine Nutzlast an einen Remote-Client, der mit dem Server verbunden ist:
remoteClient . Send ( byte [ ] payload , int payloadSize ) ;
// or:
server . SendPayload ( RemoteClient client , byte [ ] payload , int payloadSize ) ;
So trennen Sie einen Client:
server . Disconnect ( RemoteClient client ) ;
Um an die beliebigen 256-Byte-Benutzerdaten zu gelangen, die mit einem Verbindungstoken übergeben werden können:
remoteClient . UserData ; // byte[256]
So stoppen Sie einen Server und trennen alle Clients:
server . Stop ( ) ;
So erstellen Sie einen neuen Kunden:
Client client = new Client ( ) ;
Um verschiedene Ereignisse anzuhören:
// 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 )
So stellen Sie mithilfe eines Verbindungstokens eine Verbindung zu einem Server her:
client . Connect ( connectToken ) ; // byte[2048] public connect token as returned by a TokenFactory
So senden Sie bei bestehender Verbindung eine Nachricht an einen Server:
client . Send ( byte [ ] payload , int payloadSize ) ;
So trennen Sie einen Client:
client . Disconnect ( ) ;
TokenFactory kann zum Generieren der öffentlichen Verbindungstokens verwendet werden, die von Clients zum Herstellen einer Verbindung mit Spielservern verwendet werden. So erstellen Sie eine neue 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
) ;
So generieren Sie ein neues öffentliches Verbindungstoken mit 2048 Byte:
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 ist eine reine Portierung des Netcode.IO-Protokolls – nicht mehr und nicht weniger. Im Kern ist Netcode.IO eine auf UDP aufbauende, auf Verschlüsselung und Verbindung basierende Abstraktion. Und genau wie UDP gibt es keinerlei Garantien hinsichtlich der Zuverlässigkeit. Es kann sein, dass Ihre Nachrichten es nicht schaffen, und vielleicht auch nicht in der richtigen Reihenfolge. Das ist einfach eine Tatsache des Internets. Allerdings benötigt jedes Spiel mit ziemlicher Sicherheit eine Art Zuverlässigkeitsschicht. Zu diesem Zweck bietet mein ReliableNetcode.NET-Projekt eine agnostische und benutzerfreundliche Zuverlässigkeitsschicht, mit der Sie diese Funktionalität zu Ihrem Spiel hinzufügen können.