77 lines
2.5 KiB
C#
77 lines
2.5 KiB
C#
|
|
using System;
|
||
|
|
using base_kcp;
|
||
|
|
using DotNetty.Common.Utilities;
|
||
|
|
using dotNetty_kcp.thread;
|
||
|
|
|
||
|
|
namespace dotNetty_kcp
|
||
|
|
{
|
||
|
|
public class ScheduleTask:IScheduleTask,ITask
|
||
|
|
{
|
||
|
|
private readonly IMessageExecutor _imessageExecutor;
|
||
|
|
|
||
|
|
private readonly IChannelManager _channelManager;
|
||
|
|
|
||
|
|
private readonly Ukcp _ukcp;
|
||
|
|
|
||
|
|
private readonly IScheduleThread _scheduleThread;
|
||
|
|
|
||
|
|
|
||
|
|
public ScheduleTask(IChannelManager channelManager, Ukcp ukcp, IScheduleThread scheduleThread)
|
||
|
|
{
|
||
|
|
_imessageExecutor = ukcp.IMessageExecutor;
|
||
|
|
_channelManager = channelManager;
|
||
|
|
_ukcp = ukcp;
|
||
|
|
_scheduleThread = scheduleThread;
|
||
|
|
}
|
||
|
|
|
||
|
|
public void execute()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
long now = _ukcp.currentMs();
|
||
|
|
//判断连接是否关闭
|
||
|
|
if (_ukcp.TimeoutMillis != 0 && now - _ukcp.TimeoutMillis > _ukcp.LastRecieveTime) {
|
||
|
|
_ukcp.internalClose();
|
||
|
|
}
|
||
|
|
if(!_ukcp.isActive()){
|
||
|
|
var user = _ukcp.user();
|
||
|
|
//抛回网络线程处理连接删除
|
||
|
|
user.Channel.EventLoop.Execute(() => {_channelManager.del(_ukcp);});
|
||
|
|
_ukcp.release();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
long timeLeft = _ukcp.getTsUpdate()-now;
|
||
|
|
//判断执行时间是否到了
|
||
|
|
if(timeLeft>0){
|
||
|
|
//System.err.println(timeLeft);
|
||
|
|
_scheduleThread.schedule(this, TimeSpan.FromMilliseconds(timeLeft));
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//long start = System.currentTimeMillis();
|
||
|
|
long next = _ukcp.flush(now);
|
||
|
|
//System.err.println(next);
|
||
|
|
//System.out.println("耗时 "+(System.currentTimeMillis()-start));
|
||
|
|
_scheduleThread.schedule(this, TimeSpan.FromMilliseconds(next));
|
||
|
|
|
||
|
|
//检测写缓冲区 如果能写则触发写事件
|
||
|
|
if(!_ukcp.WriteQueue.IsEmpty&&_ukcp.canSend(false)
|
||
|
|
){
|
||
|
|
_ukcp.notifyWriteEvent();
|
||
|
|
}
|
||
|
|
} catch (Exception e) {
|
||
|
|
Console.WriteLine(e);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Run(ITimeout timeout)
|
||
|
|
{
|
||
|
|
_imessageExecutor.execute(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Run()
|
||
|
|
{
|
||
|
|
_imessageExecutor.execute(this);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|