Una implementación C# puramente administrada de la especificación Netcode.IO
El objetivo de este proyecto es proporcionar una implementación puramente administrada de la especificación Netcode.IO codificada en .NET 3.5 y sin DLL o contenedores nativos para una máxima portabilidad. En lugar de utilizar libsodium como la implementación de referencia C original, esta implementación utiliza una versión personalizada de la biblioteca de criptografía Bouncy Castle. Puede encontrar el código fuente original aquí: https://github.com/bcgit/bc-csharp
Además, está diseñado para su uso en juegos. Con este fin, ha sido diseñado desde cero para tener el mínimo impacto posible en las asignaciones de GC. En su mayor parte, no debería ver ningún impacto en GC por el uso de Netcode.IO.NET.
La mayor parte de la API reside en el espacio de nombres NetcodeIO.NET
Para crear e iniciar un nuevo servidor:
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
Para escuchar varios eventos:
// 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 )
Para enviar una carga útil a un cliente remoto conectado al servidor:
remoteClient . Send ( byte [ ] payload , int payloadSize ) ;
// or:
server . SendPayload ( RemoteClient client , byte [ ] payload , int payloadSize ) ;
Para desconectar un cliente:
server . Disconnect ( RemoteClient client ) ;
Para acceder a los datos de usuario arbitrarios de 256 bytes que se pueden pasar con un token de conexión:
remoteClient . UserData ; // byte[256]
Para detener un servidor y desconectar cualquier cliente:
server . Stop ( ) ;
Para crear un nuevo cliente:
Client client = new Client ( ) ;
Para escuchar varios eventos:
// 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 )
Para conectarse a un servidor usando un token de conexión:
client . Connect ( connectToken ) ; // byte[2048] public connect token as returned by a TokenFactory
Para enviar un mensaje a un servidor cuando esté conectado:
client . Send ( byte [ ] payload , int payloadSize ) ;
Para desconectar un cliente:
client . Disconnect ( ) ;
TokenFactory se puede utilizar para generar tokens de conexión públicos utilizados por los clientes para conectarse a los servidores del juego. Para crear una nueva 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
) ;
Para generar un nuevo token de conexión pública de 2048 bytes:
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 es una versión pura del protocolo Netcode.IO, nada más y nada menos. En esencia, Netcode.IO es una abstracción basada en cifrado y conexión sobre UDP. Y, al igual que UDP, no tiene garantías de confiabilidad. Es posible que sus mensajes no lleguen y que no lleguen en orden. Eso es sólo un hecho de Internet. Dicho esto, es casi seguro que cualquier juego necesitará algún tipo de capa de confiabilidad. Con ese fin, mi proyecto ReliableNetcode.NET proporciona una capa de confiabilidad independiente y fácil de usar que puedes usar para agregar esta funcionalidad a tu juego.