82 lines
2.7 KiB
C#
82 lines
2.7 KiB
C#
using DotNetty.Buffers;
|
|||
|
|
using DotNetty.Handlers.Timeout;
|
||
|
|
using DotNetty.Transport.Channels;
|
||
|
|
using JSMachine.WMS.Infrastructure.Helper;
|
||
|
|
using JSMachine.WMS.Netty.Common.Util;
|
||
|
|
using JSMachine.WMS.Netty.NettyAsServer.Transport;
|
||
|
|
using System;
|
||
|
|
|
||
|
|
namespace JSMachine.WMS.Netty.NettyAsServer
|
||
|
|
{
|
||
|
|
public class EchoServerChannelHandler : ChannelHandlerAdapter
|
||
|
|
{
|
||
|
|
private NettyServerTransport NettyTransport;
|
||
|
|
|
||
|
|
public override void ChannelActive(IChannelHandlerContext context)
|
||
|
|
{
|
||
|
|
LogHelper.Info($"客户端 {context.ToIPInfo(AddressOnwer.Remote).IP} 已连接");
|
||
|
|
NettyTransport = new NettyServerTransport(context);
|
||
|
|
|
||
|
|
base.ChannelActive(context);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void ChannelRead(IChannelHandlerContext context, object message)
|
||
|
|
{
|
||
|
|
//LogsTool.Default.Info("收到服务端TCP信息");
|
||
|
|
if(message is IByteBuffer byteBuffer)
|
||
|
|
NettyTransport.ChannelReadHandle(byteBuffer);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush();
|
||
|
|
|
||
|
|
public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)
|
||
|
|
{
|
||
|
|
//LogsTool.Default.Error("Exception: " + exception);
|
||
|
|
TransportManager.RemoveInActiveChannel(context);
|
||
|
|
context.CloseAsync();
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void HandlerAdded(IChannelHandlerContext context)
|
||
|
|
{
|
||
|
|
base.HandlerAdded(context);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void HandlerRemoved(IChannelHandlerContext context)
|
||
|
|
{
|
||
|
|
LogHelper.Warn($"客户端 {context.ToIPInfo(AddressOnwer.Remote).IP} 下线.");
|
||
|
|
TransportManager.RemoveInActiveChannel(context);
|
||
|
|
base.HandlerRemoved(context);
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void UserEventTriggered(IChannelHandlerContext context, object evt)
|
||
|
|
{
|
||
|
|
IdleStateEvent eventState = evt as IdleStateEvent;
|
||
|
|
|
||
|
|
if (eventState.State == IdleState.ReaderIdle)
|
||
|
|
{
|
||
|
|
//没有任何读取
|
||
|
|
RemoveInactiveChannel();
|
||
|
|
}
|
||
|
|
else if (eventState.State == IdleState.WriterIdle)
|
||
|
|
{
|
||
|
|
//没有任何写入
|
||
|
|
RemoveInactiveChannel();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
if (eventState.State == IdleState.AllIdle)
|
||
|
|
{
|
||
|
|
//没有任何交互
|
||
|
|
RemoveInactiveChannel();
|
||
|
|
}
|
||
|
|
|
||
|
|
base.UserEventTriggered(context, evt);
|
||
|
|
|
||
|
|
void RemoveInactiveChannel()
|
||
|
|
{
|
||
|
|
context.CloseAsync();
|
||
|
|
TransportManager.RemoveInActiveChannel(context);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|