using Microsoft.Extensions.Options;
|
using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Net.Sockets;
|
using System.Text;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using WIDESEAWCS_QuartzJob;
|
|
namespace WIDESEAWCS_Tasks.SocketServer
|
{
|
/// <summary>
|
/// TCP Socket·þÎñ¶Ë£¨»ùÓÚÐÐÐÒ飬°´»»Ðзû·Ö¸îÏûÏ¢£©
|
/// </summary>
|
public partial class TcpSocketServer : IDisposable
|
{
|
private readonly SocketServerOptions _options;
|
public readonly object _syncRoot = new();
|
private TcpListener? _listener;
|
public CancellationTokenSource? _cts;
|
public readonly List<Task> _clientTasks = new();
|
public readonly Dictionary<string, TcpClient> _clients = new();
|
public readonly Dictionary<string, string> _deviceBindings = new();
|
public readonly Dictionary<string, SemaphoreSlim> _clientLocks = new();
|
public readonly Dictionary<string, Encoding> _clientEncodings = new();
|
public readonly Dictionary<string, DateTime> _clientLastActive = new();
|
public readonly Encoding _textEncoding;
|
public readonly Encoding? _autoDetectedGb2312;
|
private readonly string _logFile;
|
private Task? _monitorTask;
|
|
public TcpSocketServer(IOptions<SocketServerOptions> options)
|
{
|
_options = options.Value;
|
if (_options.AutoDetectEncoding)
|
{
|
_textEncoding = Encoding.UTF8;
|
try { _autoDetectedGb2312 = Encoding.GetEncoding("GBK"); } catch { _autoDetectedGb2312 = null; }
|
}
|
else
|
{
|
try { _textEncoding = Encoding.GetEncoding(_options.EncodingName ?? "utf-8"); }
|
catch { _textEncoding = Encoding.UTF8; }
|
_autoDetectedGb2312 = null;
|
}
|
|
_logFile = Path.Combine(AppContext.BaseDirectory ?? ".", _options.LogFilePath ?? "socketserver.log");
|
Log($"[{DateTime.Now}] TcpSocketServer starting");
|
}
|
|
public bool IsRunning { get; private set; }
|
|
public event Func<string, bool, TcpClient, RobotSocketState, Task<string?>>? MessageReceived;
|
public event Func<string, Task<string?>>? RobotReceived;
|
|
private void Log(string message)
|
{
|
Console.WriteLine(message);
|
try { File.AppendAllText(_logFile, message + Environment.NewLine); } catch { }
|
}
|
}
|
}
|