aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MultiplayerToolkit/Assets/MultiplayerToolkit/Packet/Packet.cs33
-rw-r--r--MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectClient.cs61
-rw-r--r--MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectCube.cs4
-rw-r--r--MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectHost.cs57
-rw-r--r--MultiplayerToolkit/Assets/MultiplayerToolkit/Test/TestNetObject/TestNetObjectServer.cs82
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
/// </summary>
public class Packet : IDisposable
{
+ public const int MAX_BUFFER_SIZE = 64000; // nearly ushort, 62.5KB
+
// 写入缓冲区
private List<byte> 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
/// </summary>
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));
}
/// <summary>
@@ -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<Player> playerList = new List<Player>();
+ 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;
}
+
}
}