Просмотр исходного кода

原来理解错误,增加AcceptAsync没有问题,另外peer不需要dispose,大部分都自动可以释放

tanghai 13 лет назад
Родитель
Сommit
1c0b38c8de

+ 8 - 10
CSharp/App/Modules/Robot/RobotViewModel.cs

@@ -85,17 +85,15 @@ namespace Modules.Robot
 			try
 			{
 				var address = new Address { HostName = this.LoginIp, Port = this.LoginPort };
-				using (Peer peer = await this.clientHost.ConnectAsync(address))
+				Peer peer = await this.clientHost.ConnectAsync(address);
+				using (Packet packet = await peer.ReceiveAsync())
 				{
-					using (Packet packet = await peer.ReceiveAsync())
-					{
-						var bytes = packet.Bytes;
-						var packetStream = new MemoryStream(bytes, 4, bytes.Length - 4);
-						var smsg = Serializer.Deserialize<SMSG_Auth_Challenge>(packetStream);
-						Logger.Debug(string.Format("opcode: {0}\n{1}", 
-							BitConverter.ToUInt16(bytes, 0), XmlHelper.XmlSerialize(smsg)));
-						await peer.DisconnectLaterAsync();
-					}
+					var bytes = packet.Bytes;
+					var packetStream = new MemoryStream(bytes, 4, bytes.Length - 4);
+					var smsg = Serializer.Deserialize<SMSG_Auth_Challenge>(packetStream);
+					Logger.Debug(string.Format("opcode: {0}\n{1}", 
+						BitConverter.ToUInt16(bytes, 0), XmlHelper.XmlSerialize(smsg)));
+					await peer.DisconnectLaterAsync();
 				}
 			}
 			catch (Exception e)

+ 2 - 13
CSharp/Platform/ENet/Peer.cs

@@ -5,7 +5,7 @@ using Log;
 
 namespace ENet
 {
-	public sealed class Peer: IDisposable
+	public sealed class Peer
 	{
 		private readonly PeerEvent peerEvent = new PeerEvent();
 		private IntPtr peerPtr;
@@ -15,18 +15,7 @@ namespace ENet
 			this.peerPtr = peerPtr;
 		}
 
-		~Peer()
-		{
-			this.Dispose(false);
-		}
-
-		public void Dispose()
-		{
-			this.Dispose(true);
-			GC.SuppressFinalize(this);
-		}
-
-		private void Dispose(bool disposing)
+		private void Reset()
 		{
 			if (this.peerPtr == IntPtr.Zero)
 			{

+ 17 - 10
CSharp/Platform/ENet/ServerHost.cs

@@ -35,12 +35,17 @@ namespace ENet
 			}
 		}
 
-		public Action<Peer> AcceptEvent
+		public Task<Peer>AcceptAsync()
 		{
-			set
+			if (this.PeersManager.ContainsKey(IntPtr.Zero))
 			{
-				this.acceptEvent = value;
+				throw new ENetException(5, "Do Not Accept Twice!");
 			}
+			var tcs = new TaskCompletionSource<Peer>();
+			var peer = new Peer(IntPtr.Zero);
+			this.PeersManager.Add(peer.PeerPtr, peer);
+			peer.PeerEvent.Connected += e => tcs.TrySetResult(peer);
+			return tcs.Task;
 		}
 
 		public void RunOnce(int timeout = 0)
@@ -59,13 +64,15 @@ namespace ENet
 				{
 					case EventType.Connect:
 					{
-						if (this.acceptEvent == null)
-						{
-							throw new ENetException(4, "No Accept Event!");
-						}
-						var peer = new Peer(ev.PeerPtr);
+						var peer = this.PeersManager[IntPtr.Zero];
+						
+						this.PeersManager.Remove(IntPtr.Zero);
+
+						peer.PeerPtr = ev.PeerPtr;
 						this.PeersManager.Add(peer.PeerPtr, peer);
-						this.acceptEvent(peer);
+
+						PeerEvent peerEvent = peer.PeerEvent;
+						peerEvent.OnConnected(ev);
 						break;
 					}
 					case EventType.Receive:
@@ -83,7 +90,7 @@ namespace ENet
 						PeerEvent peerEvent = peer.PeerEvent;
 
 						this.PeersManager.Remove(ev.PeerPtr);
-						// enet_peer_disconnect会reset Peer,这里设置为0,防止再次Dispose
+						// enet_peer_disconnect  reset Peer,这里设置为0,防止再次Dispose
 						peer.PeerPtr = IntPtr.Zero;
 						
 						if (peerEvent.Received != null)

+ 22 - 20
CSharp/Platform/ENetTest/ENetClientServerTest.cs

@@ -1,6 +1,7 @@
 using System.Threading;
 using ENet;
 using Helper;
+using Log;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 
 namespace ENetCSTest
@@ -10,38 +11,39 @@ namespace ENetCSTest
 	{
 		private static async void ClientEvent(ClientHost host, Address address)
 		{
-			using (var peer = await host.ConnectAsync(address))
+			var peer = await host.ConnectAsync(address);
+			using (var sPacket = new Packet("0123456789".ToByteArray(), PacketFlags.Reliable))
 			{
-				using (var sPacket = new Packet("0123456789".ToByteArray(), PacketFlags.Reliable))
-				{
-					peer.Send(0, sPacket);
-				}
-
-				using (var rPacket = await peer.ReceiveAsync())
-				{
-					CollectionAssert.AreEqual("9876543210".ToByteArray(), rPacket.Bytes);
-				}
+				peer.Send(0, sPacket);
+			}
 
-				await peer.DisconnectLaterAsync();
+			using (var rPacket = await peer.ReceiveAsync())
+			{
+				Logger.Debug(rPacket.Bytes.ToStr());
+				CollectionAssert.AreEqual("9876543210".ToByteArray(), rPacket.Bytes);
 			}
+
+			await peer.DisconnectAsync();
+			
 			host.Stop();
 		}
 
-		private static async void OnAccept(ServerHost host, Peer peer)
+		private static async void ServerEvent(ServerHost host)
 		{
+			var peer = await host.AcceptAsync();
+			// Client断开,Server端收到Disconnect事件,结束Server线程
+			peer.PeerEvent.Disconnect += ev => host.Stop();
+
 			using (var rPacket = await peer.ReceiveAsync())
 			{
+				Logger.Debug(rPacket.Bytes.ToStr());
 				CollectionAssert.AreEqual("0123456789".ToByteArray(), rPacket.Bytes);
 			}
 
-			using(var sPacket = new Packet("9876543210".ToByteArray(), PacketFlags.Reliable))
+			using (var sPacket = new Packet("9876543210".ToByteArray(), PacketFlags.Reliable))
 			{
 				peer.Send(0, sPacket);
-				host.Flush();
 			}
-
-			// Client断开,Server端收到Disconnect事件,结束Server线程
-			peer.PeerEvent.Disconnect += (ev) => host.Stop();
 		}
 
 		[TestMethod]
@@ -51,9 +53,6 @@ namespace ENetCSTest
 			var clientHost = new ClientHost();
 			var serverHost = new ServerHost(address);
 
-			// accept回调事件
-			serverHost.AcceptEvent = peer => OnAccept(serverHost, peer);
-
 			var serverThread = new Thread(() => serverHost.Start(10));
 			var clientThread = new Thread(() => clientHost.Start(10));
 
@@ -63,6 +62,9 @@ namespace ENetCSTest
 			// 往client host线程增加事件,client线程连接server
 			clientHost.Events += () => ClientEvent(clientHost, address);
 
+			// 往server host线程增加事件,accept
+			serverHost.Events += () => ServerEvent(serverHost);
+
 			serverThread.Join();
 			clientThread.Join();
 		}