| | |
| | | public partial class TcpSocketServer : IDisposable |
| | | { |
| | | private readonly SocketServerOptions _options; |
| | | |
| | | /// <summary> |
| | | /// æä¾ä¸ä¸ªå¯ç¨äºåæ¥å¯¹å
å«å®ä¾ç访é®ç对象ã |
| | | /// </summary> |
| | | /// <remarks>å¨å¯¹å®ä¾å®ç°çº¿ç¨å®å
¨æä½æ¶ï¼å¯å°æ¤å¯¹è±¡ç¨ä½éå®ç®æ ãæ¤æ¨¡å¼é常ç¨äºé¿å
æ»éå¹¶ç¡®ä¿ä¸è´ç忥ã</remarks> |
| | | public readonly object _syncRoot = new(); |
| | | |
| | | private TcpListener? _listener; |
| | | |
| | | /// <summary> |
| | | /// 表示ç¨äºååºè¿è¡ä¸æä½çåæ¶è¯·æ±çåæ¶ä»¤çæºã |
| | | /// </summary> |
| | | /// <remarks>妿å½åæ²¡ææ´»å¨çåæ¶æºå¶ï¼æ¤å段å¯è½ä¸ºnullãä½¿ç¨æ¤ä»¤çæºåæ¶æ¯æåæ¶ç任塿æä½ã</remarks> |
| | | public CancellationTokenSource? _cts; |
| | | |
| | | /// <summary> |
| | | /// æä¾è¡¨ç¤ºæ´»å¨å®¢æ·ç«¯æä½çä»»å¡å表ã |
| | | /// </summary> |
| | | /// <remarks>æ¤å段ç¨äºå
é¨è·è¸ªå¼æ¥å®¢æ·ç«¯æ´»å¨ã宿¯åªè¯»çï¼ä¸åºå¨å
å«ç±»å¤é¨ç´æ¥ä¿®æ¹ã</remarks> |
| | | public readonly List<Task> _clientTasks = new(); |
| | | |
| | | /// <summary> |
| | | /// æä¾ä»å®¢æ·ç«¯æ è¯ç¬¦å°å
¶å
³èçTCP客æ·ç«¯è¿æ¥çæ å°ã |
| | | /// </summary> |
| | | /// <remarks>æ¤åå
¸å
许éè¿å¯ä¸å符串æ è¯ç¬¦è®¿é®æ´»å¨çTCP客æ·ç«¯ãå¨å¤çº¿ç¨åºæ¯ä¸ï¼å¯¹éåçä¿®æ¹åºå°å¿è¿è¡ä»¥é¿å
å¹¶åé®é¢ã</remarks> |
| | | public readonly Dictionary<string, TcpClient> _clients = new(); |
| | | |
| | | /// <summary> |
| | | /// æä¾ä»è®¾å¤æ è¯ç¬¦å°å
¶å¯¹åºç»å®å¼çæ å°ã |
| | | /// </summary> |
| | | /// <remarks>æ¤å段æ¯åªè¯»çï¼ç¨äºå
å«ç±»å
é¨ä½¿ç¨ãåºéè¿æå®çæ¹æ³æå±æ§å¯¹åå
¸è¿è¡ä¿®æ¹ä»¥ç¡®ä¿ä¸è´æ§ã</remarks> |
| | | public readonly Dictionary<string, string> _deviceBindings = new(); |
| | | |
| | | /// <summary> |
| | | /// æä¾ä»å®¢æ·ç«¯æ è¯ç¬¦å°å
¶å
³èéçæ å°ï¼ç¨äºåæ¥å¯¹å®¢æ·ç«¯ç¹å®èµæºç访é®ã |
| | | /// </summary> |
| | | /// <remarks>åå
¸ä¸çæ¯ä¸ªæ¡ç®å°ä¸ä¸ªå¯ä¸ç客æ·ç«¯IDä¸ä¸ä¸ª<see cref="SemaphoreSlim"/>å®ä¾å
³èï¼å®ç°æ¯ä¸ªå®¢æ·ç«¯ç线ç¨å®å
¨æä½ãæ¤éåç¨äºå
é¨åè°å¹¶å访é®ï¼ä¸åºç´æ¥ä¿®æ¹ã</remarks> |
| | | public readonly Dictionary<string, SemaphoreSlim> _clientLocks = new(); |
| | | |
| | | /// <summary> |
| | | /// æä¾ä»å®¢æ·ç«¯æ è¯ç¬¦å°å
¶å
³èææ¬ç¼ç çæ å°ã |
| | | /// </summary> |
| | | /// <remarks>æ¤åå
¸ç¨äºå
é¨è·è¸ªå·²è¿æ¥å®¢æ·ç«¯çç¼ç å好ãé®è¡¨ç¤ºå®¢æ·ç«¯æ è¯ç¬¦ï¼å¼æå®ç¨äºææ¬æä½ç对åº<see cref="System.Text.Encoding"/>ã</remarks> |
| | | public readonly Dictionary<string, Encoding> _clientEncodings = new(); |
| | | |
| | | /// <summary> |
| | | /// å卿¯ä¸ªå®¢æ·ç«¯æåæ´»å¨çæ¶é´æ³ï¼ä»¥å®¢æ·ç«¯æ è¯ç¬¦ä¸ºé®ã |
| | | /// </summary> |
| | | /// <remarks>æ¤å段ç¨äºå
é¨è·è¸ªå®¢æ·ç«¯æ´»å¨ãåå
¸å°å®¢æ·ç«¯æ è¯ç¬¦æ å°å°å¯¹åºçæåæ´»å¨æ¶é´ï¼UTCï¼ãç´æ¥ä¿®æ¹æ¤éåå¯è½å½±å客æ·ç«¯ä¼è¯ç®¡çé»è¾ã</remarks> |
| | | public readonly Dictionary<string, DateTime> _clientLastActive = new(); |
| | | |
| | | /// <summary> |
| | | /// æå®å
å«ç±»åä¸åç¬¦æ°æ®ä½¿ç¨çææ¬ç¼ç ã |
| | | /// </summary> |
| | | /// <remarks>ä½¿ç¨æ¤å段确å®å¤çåç¬¦æ°æ®æ¶å¦ä½ç¼ç æè§£ç ææ¬ãç¼ç å½±ååèå¦ä½è¢«è§£é为å符ï¼åä¹äº¦ç¶ã常è§çç¼ç å
æ¬UTF8ãASCIIåUnicodeã</remarks> |
| | | public readonly Encoding _textEncoding; |
| | | |
| | | /// <summary> |
| | | /// 表示èªå¨æ£æµå°çGB2312ç¼ç ï¼å¦æå¯ç¨ï¼ã |
| | | /// </summary> |
| | | /// <remarks>é常ä»è¾å
¥æ°æ®ç¡®å®ç¼ç æ¶è®¾ç½®æ¤å段ãå¦ææ£æµå¤±è´¥ææªæ§è¡æ£æµï¼å¼å¯è½ä¸ºnullã</remarks> |
| | | public readonly Encoding? _autoDetectedGb2312; |
| | | |
| | | private readonly string _logFile; |
| | | |
| | | private Task? _monitorTask; |
| | | |
| | | /// <summary> |
| | | /// ä½¿ç¨æå®çæå¡å¨é项åå§å TcpSocketServer ç±»çæ°å®ä¾ã |
| | | /// </summary> |
| | | /// <remarks>妿å¯ç¨äº AutoDetectEncoding éé¡¹ï¼æå¡å¨å°é»è®¤ä½¿ç¨ UTF-8 ç¼ç ï¼ |
| | | /// å¹¶å°è¯æ¯æ GBK ç¼ç è¿è¡èªå¨æ£æµã妿ç¼ç æ£æµå¤±è´¥ææä¾äºæ æçç¼ç åç§°ï¼ |
| | | /// å°åéä½¿ç¨ UTF-8 ç¼ç ãæ¥å¿æä»¶è·¯å¾ç± LogFilePath é项å³å®ï¼ |
| | | /// å¦ææªæå®ï¼åé»è®¤ä¸ºåºç¨ç¨åºåºç®å½ä¸ç 'socketserver.log' æä»¶ã</remarks> |
| | | /// <param name="options">奿¥åæå¡å¨çé
ç½®é项ãä¸è½ä¸º nullãæä¾ç¼ç è®¾ç½®ãæ¥å¿æä»¶è·¯å¾åèªå¨æ£æµè¡ä¸ºçé
ç½®ã</param> |
| | | public TcpSocketServer(IOptions<SocketServerOptions> options) |
| | | { |
| | | _options = options.Value; |
| | |
| | | |
| | | public bool IsRunning { get; private set; } |
| | | |
| | | public event Func<string, bool, TcpClient, RobotSocketState, Task<string?>>? MessageReceived; |
| | | public event Func<string, bool, TcpClient, StackerSocketState, Task<string?>>? MessageReceived; |
| | | |
| | | public event Func<string, Task<string?>>? RobotReceived; |
| | | |
| | | private void Log(string message) |