Files
hjha-server/ServerCore/NetWork/AService.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

92 lines
2.5 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Threading;
using MrWu.Debug;
namespace Server.Net
{
public abstract class AService : IDisposable
{
/// <summary>
/// 监听回调
/// </summary>
public Action<long, IPEndPoint> AcceptCallBack;
/// <summary>
/// 读取收包数据
/// </summary>
public Action<long, MemoryBuffer> ReadCallBack;
/// <summary>
/// 错误回调
/// </summary>
public Action<long, int> ErrorCallBack;
public ServiceType ServiceType { get; protected set; }
private const int MaxMemoryBufferSize = 1024 * 1;
/// <summary>
/// 每个的大小都是MaxMemoryBufferSize
/// </summary>
private readonly ConcurrentQueue<MemoryBuffer> pool = new ConcurrentQueue<MemoryBuffer>();
public MemoryBuffer Fetch(int size = 0)
{
ServiceThreadManager.Instance.CheckThread(this, Thread.CurrentThread.ManagedThreadId);
if (size > MaxMemoryBufferSize)
{
return new MemoryBuffer(size);
}
if (size < MaxMemoryBufferSize)
{
size = MaxMemoryBufferSize;
}
if (pool.TryDequeue(out MemoryBuffer memoryBuffer))
{
return memoryBuffer;
}
return new MemoryBuffer(size);
}
public void Recycle(MemoryBuffer memoryBuffer)
{
if (memoryBuffer.Capacity > MaxMemoryBufferSize)
{
return;
}
//池最大数量
if (this.pool.Count > 10)
{
return;
}
memoryBuffer.Seek(0, SeekOrigin.Begin);
memoryBuffer.SetLength(0);
this.pool.Enqueue(memoryBuffer);
}
public virtual void Dispose()
{
}
public abstract void Update();
public abstract void Remove(long id, int error = 0);
public abstract bool IsDisposed();
public abstract void Create(long id, IPEndPoint ipEndPoint);
public abstract void Send(long channelId, MemoryBuffer memoryBuffer);
}
}