upm_guru_kcp/Runtime/csharp-kcp/dotNetty-kcp/ServerConvChannelManager.cs

65 lines
1.7 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Net;
using System.Xml.Linq;
using DotNetty.Transport.Channels;
using DotNetty.Transport.Channels.Sockets;
namespace dotNetty_kcp
{
/**
* 根据conv确定一个session
*/
public class ServerConvChannelManager : IChannelManager
{
private readonly ConcurrentDictionary<int, Ukcp> _ukcps = new ConcurrentDictionary<int, Ukcp>();
private readonly int convIndex;
public ServerConvChannelManager(int convIndex)
{
this.convIndex = convIndex;
}
public Ukcp get(DatagramPacket msg)
{
var conv = getConv(msg);
_ukcps.TryGetValue(conv, out var ukcp);
return ukcp;
}
private int getConv(DatagramPacket msg) {
var bytebuffer = msg.Content;
return bytebuffer.GetIntLE(convIndex);;
}
public void New(EndPoint endPoint, Ukcp ukcp,DatagramPacket msg)
{
var conv = ukcp.getConv();
if (msg != null) {
conv = getConv(msg);
ukcp.setConv(conv);
}
_ukcps.TryAdd(conv, ukcp);
}
public void del(Ukcp ukcp)
{
_ukcps.TryRemove(ukcp.getConv(), out var temp);
if (temp == null)
{
Console.WriteLine("ukcp session is not exist conv: " + ukcp.getConv());
}
}
public ICollection<Ukcp> getAll()
{
return this._ukcps.Values;
}
}
}