การใช้งาน C# ที่มีการจัดการอย่างแท้จริงของข้อกำหนด Netcode.IO
เป้าหมายของโปรเจ็กต์นี้คือเพื่อให้มีการใช้งานข้อกำหนด Netcode.IO ที่ได้รับการจัดการอย่างแท้จริงซึ่งเข้ารหัสด้วย .NET 3.5 และใช้ DLLs หรือ Wrappers เนทิฟเป็นศูนย์เพื่อการพกพาสูงสุด แทนที่จะใช้ 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
) ;
วิธีสร้างโทเค็นการเชื่อมต่อสาธารณะขนาด 2,048 ไบต์ใหม่:
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 ก็คือไม่มีการรับประกันเกี่ยวกับความน่าเชื่อถือ ข้อความของคุณอาจไม่ได้ทำและอาจไม่เป็นไปตามลำดับ นั่นเป็นเพียงข้อเท็จจริงของอินเทอร์เน็ต อย่างที่กล่าวไปแล้วว่าเกมใดๆ ก็ตามแทบจะจำเป็นต้องมีชั้นความน่าเชื่อถือบางประเภทอย่างแน่นอน ด้วยเหตุนี้ โปรเจ็กต์ TrustedNetcode.NET ของฉันจึงมีเลเยอร์ความน่าเชื่อถือที่ไม่เชื่อเรื่องพระเจ้าและใช้งานง่าย ซึ่งคุณสามารถใช้เพื่อเพิ่มฟังก์ชันนี้ให้กับเกมของคุณได้