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 ClientConvChannelManager : IChannelManager { private readonly ConcurrentDictionary _ukcps = new ConcurrentDictionary(); private readonly int convIndex; public ClientConvChannelManager(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()); } ukcp.user().Channel.CloseAsync(); } public ICollection getAll() { return this._ukcps.Values; } } }