From d6c00a81eebe9df818a54b27343f6c403ee5632b Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Tue, 17 Oct 2023 16:09:56 +0800 Subject: * netobject test --- .../Assets/MultiplayerToolkit/Packet/Packet.cs | 33 ++++++++- .../Test/TestNetObject/TestNetObjectClient.cs | 61 +++++++++------- .../Test/TestNetObject/TestNetObjectCube.cs | 4 +- .../Test/TestNetObject/TestNetObjectHost.cs | 57 ++++++++++----- .../Test/TestNetObject/TestNetObjectServer.cs | 82 +++++++++++++--------- 5 files changed, 160 insertions(+), 77 deletions(-) diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Packet/Packet.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Packet/Packet.cs index eb07feb..d7974a3 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Packet/Packet.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Packet/Packet.cs @@ -29,6 +29,8 @@ namespace MultiplayerToolkit /// public class Packet : IDisposable { + public const int MAX_BUFFER_SIZE = 64000; // nearly ushort, 62.5KB + // 写入缓冲区 private List writableBuffer; @@ -41,6 +43,15 @@ namespace MultiplayerToolkit private bool disposed; + // + public int writeBufferLength + { + get + { + return GetWritableBufferLength(); + } + } + #region 创建 public static Packet GetWritablePacket() @@ -123,7 +134,8 @@ namespace MultiplayerToolkit /// public void InsertLength() { - this.writableBuffer.InsertRange(0, BitConverter.GetBytes(this.writableBuffer.Count)); + ushort count = (ushort)this.writableBuffer.Count; + this.writableBuffer.InsertRange(0, BitConverter.GetBytes(count)); } /// @@ -174,6 +186,11 @@ namespace MultiplayerToolkit this.writableBuffer.AddRange(BitConverter.GetBytes(_value)); } + public void WriteUshort(ushort _value) + { + this.writableBuffer.AddRange(BitConverter.GetBytes(_value)); + } + public void WriteInt(int _value) { this.writableBuffer.AddRange(BitConverter.GetBytes(_value)); @@ -277,6 +294,20 @@ namespace MultiplayerToolkit throw new Exception("Could not read value of type 'short'!"); } + public ushort ReadUshort(bool _moveReadPos = true) + { + if (this.readableBuffer.Length > this.readPos) + { + ushort value = BitConverter.ToUInt16(this.readableBuffer, this.readPos); + if (_moveReadPos) + { + this.readPos += 2; + } + return value; + } + throw new Exception("Could not read value of type 'short'!"); + } + public int ReadInt(bool _moveReadPos = true) { if (this.readableBuffer.Length > this.readPos) diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs index b368526..cf3b563 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs @@ -4,12 +4,23 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; -// Íæ¼Ò +// Íæ¼Ò2 public class TestNetObjectClient : MonoBehaviour { NetClient client; public NetObject cube; + enum EMsgID : ushort + { + NetObject = 253, + + Hello = 51825, + + } + + private int playerId; + + bool connected = false; private void Start() { @@ -24,39 +35,41 @@ public class TestNetObjectClient : MonoBehaviour private async void ConnectServer(NetClientSetting setting) { await client.ConnectToServer(setting); - - Packet packet = Packet.GetWritablePacket(); - packet.WriteString("hello, world"); - packet.WriteQuaternion(Quaternion.identity); - - client.SendData(packet.ToArray(), 0, packet.GetWritableBufferLength(), ESendOption.Reliable); } private void OnRecvData(byte[] data, int len, ESendOption sendOption) { Packet packet = Packet.GetReadablePacket(data, 0, len); - if (sendOption == ESendOption.Reliable) + HandleMessage(packet, null); + } + + void HandleMessage(Packet packet, object state) + { + ushort len = packet.ReadUshort(); + ushort msg = packet.ReadUshort(); + + int id = packet.ReadInt();// playerId + + switch (msg) { - if (packet.GetUnreadLength() >= 4) - { - int value = packet.ReadInt(); - if (value == 51825) // hello + case (ushort)EMsgID.Hello: { - int id = packet.ReadInt(); + playerId = id; Packet echo = Packet.GetWritablePacket(); - echo.WriteInt((int)51825); - echo.WriteInt(id); + echo.WriteUshort((ushort)EMsgID.Hello); + echo.WriteInt(playerId); echo.WriteString("UDP haloha"); - client.SendData(echo.ToArray(), 0, echo.GetWritableBufferLength(), ESendOption.Unreliable); - return; + echo.InsertLength(); + client.SendData(echo.ToArray(), 0, echo.writeBufferLength, ESendOption.Unreliable); + connected = true; + Debug.Log("connected"); } - } - } - - int msg = packet.ReadInt(); - if(msg == 253) - { - cube.Deserialize(packet, false); + break; + case (ushort)EMsgID.NetObject: + { + cube.Deserialize(packet, false); + } + break; } } diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs index ab892c6..c1f1813 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs @@ -8,7 +8,9 @@ public class TestNetObjectCube : NetObject public override void Deserialize(Packet reader, bool initialState) { Vector3 pos = reader.ReadVector3(); + Quaternion rot = reader.ReadQuaternion(); transform.position = pos; + transform.rotation = rot; } public override void HandleRpc(byte callId, Packet reader) @@ -17,8 +19,8 @@ public class TestNetObjectCube : NetObject public override bool Serialize(Packet writer, bool initialState) { - //writer.WriteInt(21538052); writer.WriteVector3(transform.position); + writer.WriteQuaternion(transform.rotation); return false; } diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs index 287fc15..b2afec0 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs @@ -5,15 +5,25 @@ using System.Collections.Generic; using UnityEngine; using System.Threading.Tasks; -// Ö÷»ú +// Ö÷»ú£¬Íæ¼Ò1 public class TestNetObjectHost : MonoBehaviour { + public bool amHost { get { return true; } } public NetObject cube; NetClient client; bool connected = false; + enum EMsgID : ushort + { + NetObject = 253, + + Hello = 51825, + + } + + private int playerId; private async void Start() { @@ -30,35 +40,42 @@ public class TestNetObjectHost : MonoBehaviour private async void ConnectServer(NetClientSetting setting) { await client.ConnectToServer(setting); - - Packet packet = Packet.GetWritablePacket(); - packet.WriteString("hello, world"); - packet.WriteQuaternion(Quaternion.identity); - - client.SendData(packet.ToArray(), 0, packet.GetWritableBufferLength(), ESendOption.Reliable); } private void OnRecvData(byte[] data, int len, ESendOption sendOption) { Packet packet = Packet.GetReadablePacket(data, 0, len); - if (sendOption == ESendOption.Reliable) + + HandleMessage(packet, null); + } + + void HandleMessage(Packet packet, object state) + { + ushort len = packet.ReadUshort(); + ushort msg = packet.ReadUshort(); + + int id = packet.ReadInt();// playerId + + switch(msg) { - if (packet.GetUnreadLength() >= 4) - { - int value = packet.ReadInt(); - if (value == 51825) // hello + case (ushort)EMsgID.Hello: { - int id = packet.ReadInt(); + playerId = id; Packet echo = Packet.GetWritablePacket(); - echo.WriteInt((int)51825); - echo.WriteInt(id); + echo.WriteUshort((ushort)EMsgID.Hello); + echo.WriteInt(playerId); echo.WriteString("UDP haloha"); - client.SendData(echo.ToArray(), 0, echo.GetWritableBufferLength(), ESendOption.Unreliable); + echo.InsertLength(); + client.SendData(echo.ToArray(), 0, echo.writeBufferLength, ESendOption.Unreliable); connected = true; Debug.Log("connected"); - return; } - } + break; + case (ushort)EMsgID.NetObject: + { + + } + break; } } @@ -76,8 +93,10 @@ public class TestNetObjectHost : MonoBehaviour if(cube != null) { Packet write = Packet.GetWritablePacket(); - write.WriteInt(253); + write.WriteUshort((ushort)EMsgID.NetObject); // ushort msgID + write.WriteInt(playerId); // playerId cube.Serialize(write, false); + write.InsertLength(); // ushort length SendPacket(write, ESendOption.Unreliable); } } diff --git a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs index d4fcf58..c0d9e99 100644 --- a/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs +++ b/MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs @@ -8,6 +8,14 @@ using System.Threading; using UnityEngine; using UnityEditor.UI; +// ЭÒé½á¹¹ +// ----------------------------------- +// 2byte (ushort) ³¤¶È£¬²»º¬Õâ2¸ö×Ö½Ú +// 2byte (ushort) ÏûÏ¢ID +// ----------------------------------- +// 4byte (ushort) playerId +// ÄÚÈÝ + public static class TestNetObjectsConstant { public static IPAddress serverIP = IPAddress.Loopback; @@ -37,6 +45,11 @@ public class TestNetObjectServer : MonoBehaviour private List playerList = new List(); + private Player GetPlayerById(int id) + { + return playerList.Find(p => p.id == id); + } + void Start() { NetServerSetting setting = new NetServerSetting(); @@ -62,16 +75,16 @@ public class TestNetObjectServer : MonoBehaviour // welcome Packet hello = Packet.GetWritablePacket(); - hello.WriteInt((int)51825); // magic number s + hello.WriteUshort((ushort)EMsgID.Hello); hello.WriteInt((int)player.id); - player.member.SendData(hello.ToArray(), 0, hello.GetWritableBufferLength(), ESendOption.Reliable); + hello.InsertLength(); + player.member.SendData(hello.ToArray(), 0, hello.writeBufferLength, ESendOption.Reliable); } private void OnRecvData(byte[] data, int len) { - Packet packet = Packet.GetReadablePacket(data); - string str = packet.ReadString(); - Debug.Log(str); + Packet packet = Packet.GetReadablePacket(data, 0, len); + HandleMessage(packet, null); } private void BroadcastToAll(Packet packet, ESendOption option) @@ -84,41 +97,46 @@ public class TestNetObjectServer : MonoBehaviour private void OnUdpReceiveData(UdpReceiveResult result) { - IPEndPoint ep = result.RemoteEndPoint; + Packet packet = Packet.GetReadablePacket(result.Buffer); + HandleMessage(packet, result); + } - Player sender = playerList.Find(p => p.member.IsBindWithUdp(ep)); - if (sender != null) - { - // ´¦ÀíÏûÏ¢ - using Packet read = Packet.GetReadablePacket(result.Buffer); - int id = read.ReadInt(); - if (id == 253) - { - using Packet write = Packet.GetWritablePacket(read); - BroadcastToAll(write, ESendOption.Unreliable); - } - return; - } + enum EMsgID : ushort + { + Hello = 51825, - using Packet packet = Packet.GetReadablePacket(result.Buffer, 0, result.Buffer.Length); + NetObject = 253, + } - if (packet.GetUnreadLength() >= 4) + private void HandleMessage(Packet packet, object state) + { + ushort len = packet.ReadUshort(); + ushort msg = packet.ReadUshort(); + + //if(msg == ) + + int id = packet.ReadInt(); // playerId + Player player = GetPlayerById(id); + + switch (msg) { - int value = packet.ReadInt(); - if (value == 51825) // hello - { - int id = packet.ReadInt(); - string content = packet.ReadString(); - Debug.Log(id); - Debug.Log(content); - var player = playerList.Find(x => x.id == id); - if (player != null) + case (ushort)EMsgID.Hello: { - Debug.Log("BindUdpClient to " + result.RemoteEndPoint); + string content = packet.ReadString(); + Debug.Log(content); + UdpReceiveResult result = (UdpReceiveResult)state; player.member.BindUdpClient(server.udpClient, result.RemoteEndPoint); } - } + break; + + case (ushort)EMsgID.NetObject: + { + using Packet write = Packet.GetWritablePacket(packet); + BroadcastToAll(write, ESendOption.Unreliable); + } + break; } + } } -- cgit v1.1-26-g67d0