Răsfoiți Sursa

增加TBuffer类,做网络缓冲区,接下来开发网络层

tanghai 11 ani în urmă
părinte
comite
303e3c0b39

+ 14 - 0
CSharp/Game/Model/Component/MessageComponent.cs

@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using Common.Base;
+using MongoDB.Bson;
+using MongoDB.Bson.Serialization.Attributes;
+
+namespace Model
+{
+    public class MessageComponent
+    {
+        public MessageComponent()
+        {
+        }
+    }
+}

+ 14 - 0
CSharp/Game/Model/MessageAttribute.cs

@@ -0,0 +1,14 @@
+using Common.Event;
+
+namespace Model
+{
+    /// <summary>
+    /// 搭配EventComponent用来分发消息
+    /// </summary>
+    public class MessageAttribute: AEventAttribute
+    {
+        public MessageAttribute(int type): base(type)
+        {
+        }
+    }
+}

+ 2 - 0
CSharp/Game/Model/Model.csproj

@@ -52,11 +52,13 @@
     <Compile Include="BehaviorTree\Node.cs" />
     <Compile Include="BehaviorTree\NodeAttribute.cs" />
     <Compile Include="Buff.cs" />
+    <Compile Include="Component\MessageComponent.cs" />
     <Compile Include="Component\BuffComponent.cs" />
     <Compile Include="Component\ConfigComponent.cs" />
     <Compile Include="Component\EventComponent.cs" />
     <Compile Include="Config\UnitConfig.cs" />
     <Compile Include="Config\BuffConfig.cs" />
+    <Compile Include="MessageAttribute.cs" />
     <Compile Include="FactoryAttribute.cs" />
     <Compile Include="Component\FactoryComponent.cs" />
     <Compile Include="IAssemblyLoader.cs" />

+ 80 - 0
CSharp/Platform/TNet/TBuffer.cs

@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+
+namespace TNet
+{
+    public class TBuffer
+    {
+        public const int chunkSize = 8096;
+
+        private LinkedList<byte[]> buffer = new LinkedList<byte[]>();
+
+        private int writeIndex;
+
+        private int readIndex;
+
+        public int Count
+        {
+            get
+            {
+                if (buffer.Count == 0)
+                {
+                    return 0;
+                }
+                return (buffer.Count - 1) * chunkSize + writeIndex - readIndex;
+            }
+        }
+
+        public byte[] ReadFrom(int n)
+        {
+            if (this.Count < n || n <= 0)
+            {
+                throw new Exception(string.Format("buffer size < n, buffer: {0} n: {1}", this.Count, n));
+            }
+            byte[] bytes = new byte[n];
+            int alreadyCopyCount = n;
+            while (alreadyCopyCount < n)
+            {
+                if (chunkSize - readIndex > n - alreadyCopyCount)
+                {
+                    Array.Copy(buffer.First.Value, readIndex, bytes, alreadyCopyCount, n - alreadyCopyCount);
+                    readIndex += n - alreadyCopyCount;
+                    alreadyCopyCount = n;
+                }
+                else
+                {
+
+                    Array.Copy(buffer.First.Value, readIndex, bytes, alreadyCopyCount, chunkSize - readIndex);
+                    alreadyCopyCount += chunkSize - readIndex;
+                    readIndex = 0;
+                    this.buffer.RemoveFirst();
+                }
+            }
+            return bytes;
+        }
+
+        public void WriteTo(byte[] bytes)
+        {
+            int alreadyCopyCount = 0;
+            while (alreadyCopyCount < bytes.Length)
+            {
+                if (writeIndex == 0)
+                {
+                    this.buffer.AddLast(new byte[chunkSize]);
+                }
+                if (chunkSize - writeIndex > alreadyCopyCount)
+                {
+                    Array.Copy(bytes, alreadyCopyCount, buffer.Last.Value, writeIndex, alreadyCopyCount);
+                    writeIndex += alreadyCopyCount;
+                    alreadyCopyCount = 0;
+                }
+                else
+                {
+                    Array.Copy(bytes, alreadyCopyCount, buffer.Last.Value, writeIndex, chunkSize - writeIndex);
+                    alreadyCopyCount -= chunkSize - writeIndex;
+                    writeIndex = 0;
+                }
+            }
+        }
+    }
+}

+ 1 - 0
CSharp/Platform/TNet/TNet.csproj

@@ -41,6 +41,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TBuffer.cs" />
     <Compile Include="TcpAcceptor.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />