Files
ww-jst/wmsjst/JSMachine.WMS.Netty/NettyAsServer/Transport/TransportManager.cs
T

133 lines
4.2 KiB
C#
Raw Normal View History

2026-09-02 16:31:50 +08:00
using DotNetty.Buffers;
using DotNetty.Transport.Channels;
using JSMachine.WMS.Common.Cache;
using JSMachine.WMS.Common.Cache.Model;
using JSMachine.WMS.Infrastructure.Helper;
using JSMachine.WMS.Netty.NettyAsServer.Command;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reactive.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace JSMachine.WMS.Netty.NettyAsServer.Transport
{
public static class TransportManager
{
/// <summary>
/// 已连接的客户端
/// key-ip 一个客户端仅允许一个连接
/// </summary>
public static readonly ConcurrentDictionary<string, IChannelHandlerContext> DicClientChannels = new();
/// <summary>
/// 移除有问题通道
/// </summary>
/// <param name="channel"></param>
public static void RemoveInActiveChannel(IChannelHandlerContext channel)
{
try
{
DicClientChannels
.Where(p => p.Value == channel)
.Select(p => p.Key)
.ToList()
?.ForEach(p => DicClientChannels.Remove(p, out IChannelHandlerContext channelHandlerContext));
}
catch (Exception ex)
{
LogHelper.Error($"移除有问题通道出错: {ex.Message} \n {ex.StackTrace}");
}
}
/// <summary>
/// 指定客户端发送消息
/// </summary>
/// <param name="ip"></param>
/// <param name="msg"></param>
/// <returns></returns>
public async static Task<bool> SendMsg(string ip, string msg)
{
var result = false;
try
{
if (!DicClientChannels.ContainsKey(ip))
return result;
IChannelHandlerContext channel = DicClientChannels[ip];
await channel.Channel.WriteAndFlushAsync(msg);
result = true;
}
catch (Exception ex)
{
LogHelper.Error($"指定客户端发送消息出错: {ex.Message} \n {ex.StackTrace}");
}
return result;
}
/// <summary>
/// 发送广播消息
/// </summary>
/// <param name="messagePackage"></param>
public static void BroadcastMsg(IByteBuffer messagePackage)
{
try
{
DicClientChannels.Keys.ToList().ForEach(async key =>
{
await DicClientChannels[key].Channel.WriteAndFlushAsync(messagePackage);
});
}
catch (Exception ex)
{
LogHelper.Error($"发送广播消息出错: {ex.Message} \n {ex.StackTrace}");
}
}
/// <summary>
/// 发送扫码命令并获取返回结果
/// </summary>
/// <param name="ip">具体扫码器的IP</param>
/// <returns></returns>
public async static Task<BarCodeInfo> SendReadBarCodeCmd(string ip)
{
var barCodeInfo = new BarCodeInfo();
try
{
string msg = new BarCodeReadCmd().Msg;
bool bRet = await SendMsg(ip, msg);
if (!bRet)
{
LogHelper.Error($"向 {ip} 发送条码扫描命令失败");
return null;
}
DateTime sendTime = DateTime.Now;
int count = 0;
while (true)
{
count++;
Thread.Sleep(100);
barCodeInfo = GlobalMemoryCache.GetCach<string, BarCodeInfo>(ip);
if (barCodeInfo == null || barCodeInfo.AddTime < sendTime)
{
if (count < 20)
continue;
else
return null;
}
}
}
catch (Exception ex)
{
LogHelper.Error($"向 {ip} 发送条码扫描命令返回结果失败{ex.Message} \n {ex.StackTrace}");
}
return barCodeInfo;
}
}
}