Netcode.IO 仕様の純粋なマネージド C# 実装
このプロジェクトの目標は、移植性を最大限に高めるためにネイティブ DLL やラッパーを使用せず、.NET 3.5 に対してコーディングされた Netcode.IO 仕様の純粋なマネージド実装を提供することです。元の C リファレンス実装のように libsodium を使用する代わりに、この実装では、Bouncy Castle 暗号化ライブラリのカスタマイズされたバージョンを使用します。元のソースコードはここで見つけることができます: https://github.com/bcgit/bc-csharp
さらに、ゲームでの使用を目的として設計されています。この目的を達成するために、GC 割り当てへの影響を可能な限り最小限に抑えるようにゼロから設計されています。ほとんどの場合、Netcode.IO.NET の使用による GC の影響はまったく見られません。
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 プロジェクトは、この機能をゲームに追加するために使用できる、不可知論的で使いやすい信頼性レイヤーを提供します。