Implementasi C# terkelola murni dari spesifikasi Netcode.IO
Tujuan dari proyek ini adalah untuk menyediakan implementasi terkelola murni dari spesifikasi Netcode.IO yang dikodekan terhadap .NET 3.5 dan tidak menggunakan DLL atau wrapper asli untuk portabilitas maksimum. Daripada menggunakan libsodium seperti implementasi referensi C asli, implementasi ini menggunakan versi perpustakaan kriptografi Bouncy Castle yang disesuaikan. Anda dapat menemukan kode sumber aslinya di sini: https://github.com/bcgit/bc-csharp
Selain itu, ini dirancang untuk digunakan dalam game. Untuk mencapai tujuan ini, hal ini telah dirancang sejak awal agar memiliki dampak seminimal mungkin terhadap alokasi GC. Secara umum, Anda tidak akan melihat dampak GC apa pun dari penggunaan Netcode.IO.NET sama sekali.
Sebagian besar API berada di namespace NetcodeIO.NET
Untuk membuat dan memulai server baru:
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
Untuk mendengarkan berbagai acara:
// 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 )
Untuk mengirim payload ke klien jarak jauh yang terhubung ke server:
remoteClient . Send ( byte [ ] payload , int payloadSize ) ;
// or:
server . SendPayload ( RemoteClient client , byte [ ] payload , int payloadSize ) ;
Untuk memutuskan sambungan klien:
server . Disconnect ( RemoteClient client ) ;
Untuk mendapatkan data pengguna 256 byte sewenang-wenang yang dapat diteruskan dengan token koneksi:
remoteClient . UserData ; // byte[256]
Untuk menghentikan server dan memutuskan sambungan klien mana pun:
server . Stop ( ) ;
Untuk membuat klien baru:
Client client = new Client ( ) ;
Untuk mendengarkan berbagai acara:
// 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 )
Untuk terhubung ke server menggunakan token koneksi:
client . Connect ( connectToken ) ; // byte[2048] public connect token as returned by a TokenFactory
Untuk mengirim pesan ke server saat terhubung:
client . Send ( byte [ ] payload , int payloadSize ) ;
Untuk memutuskan sambungan klien:
client . Disconnect ( ) ;
TokenFactory dapat digunakan untuk menghasilkan token koneksi publik yang digunakan oleh klien untuk terhubung ke server game. Untuk membuat TokenFactory baru:
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
) ;
Untuk menghasilkan token koneksi publik 2048 byte yang baru:
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 adalah port murni dari protokol Netcode.IO - tidak lebih dan tidak kurang. Pada intinya, Netcode.IO adalah abstraksi berbasis enkripsi dan koneksi di atas UDP. Dan, sama seperti UDP, ia tidak memiliki jaminan keandalan. Pesan Anda mungkin tidak sesuai, dan mungkin tidak sesuai. Itu hanya fakta internet. Meskipun demikian, game apa pun hampir pasti membutuhkan semacam lapisan keandalan. Untuk itu, proyek ReliableNetcode.NET saya menyediakan lapisan keandalan agnostik dan mudah digunakan yang dapat Anda gunakan untuk menambahkan fungsionalitas ini ke game Anda.