91 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
using System;
 | 
						|
using System.IO;
 | 
						|
using DotNetty.Buffers;
 | 
						|
using DotNetty.Common;
 | 
						|
using dotNetty_kcp.thread;
 | 
						|
 | 
						|
namespace dotNetty_kcp
 | 
						|
{
 | 
						|
    public class WriteTask : ITask
 | 
						|
    {
 | 
						|
        private Ukcp kcp;
 | 
						|
 | 
						|
        private static readonly ThreadLocalPool<WriteTask> RECYCLER =
 | 
						|
            new ThreadLocalPool<WriteTask>(handle => new WriteTask(handle));
 | 
						|
 | 
						|
        private readonly ThreadLocalPool.Handle recyclerHandle;
 | 
						|
 | 
						|
        private WriteTask(ThreadLocalPool.Handle recyclerHandle)
 | 
						|
        {
 | 
						|
            this.recyclerHandle = recyclerHandle;
 | 
						|
        }
 | 
						|
 | 
						|
        public static WriteTask New(Ukcp kcp)
 | 
						|
        {
 | 
						|
            WriteTask recieveTask = RECYCLER.Take();
 | 
						|
            recieveTask.kcp = kcp;
 | 
						|
            return recieveTask;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        public void execute()
 | 
						|
        {
 | 
						|
            try
 | 
						|
            {
 | 
						|
                //查看连接状态
 | 
						|
                if (!kcp.isActive())
 | 
						|
                {
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                //从发送缓冲区到kcp缓冲区
 | 
						|
                var writeQueue = kcp.WriteQueue;
 | 
						|
                IByteBuffer byteBuf = null;
 | 
						|
                while (kcp.canSend(false))
 | 
						|
                {
 | 
						|
                    if (!writeQueue.TryDequeue(out byteBuf))
 | 
						|
                    {
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                    try
 | 
						|
                    {
 | 
						|
                        this.kcp.send(byteBuf);
 | 
						|
                        byteBuf.Release();
 | 
						|
                    }
 | 
						|
                    catch (IOException e)
 | 
						|
                    {
 | 
						|
                        kcp.getKcpListener().handleException(e, kcp);
 | 
						|
                        return;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                //如果有发送 则检测时间
 | 
						|
                if (kcp.canSend(false) && (!kcp.checkFlush() || !kcp.isFastFlush()))
 | 
						|
                {
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                long now = kcp.currentMs();
 | 
						|
                long next = kcp.flush(now);
 | 
						|
                //System.out.println(next);
 | 
						|
                //System.out.println("耗时"+(System.currentTimeMillis()-now));
 | 
						|
                kcp.setTsUpdate(now + next);
 | 
						|
            }
 | 
						|
            catch (Exception e)
 | 
						|
            {
 | 
						|
                Console.WriteLine(e);
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                release();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void release()
 | 
						|
        {
 | 
						|
            kcp.WriteProcessing.Set(false);
 | 
						|
            kcp = null;
 | 
						|
            recyclerHandle.Release(this);
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |