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
{
///
/// 监听回调
///
public Action AcceptCallBack;
///
/// 读取收包数据
///
public Action ReadCallBack;
///
/// 错误回调
///
public Action ErrorCallBack;
public ServiceType ServiceType { get; protected set; }
private const int MaxMemoryBufferSize = 1024 * 1;
///
/// 每个的大小都是MaxMemoryBufferSize
///
private readonly ConcurrentQueue pool = new ConcurrentQueue();
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);
}
}