| | |
| | | { |
| | | public partial class TcpSocketServer |
| | | { |
| | | /// <summary> |
| | | /// æ£ç´¢å½å卿å¡ä¸æ³¨åçææå®¢æ·ç«¯æ è¯ç¬¦çåªè¯»å表ã |
| | | /// </summary> |
| | | /// <remarks>è¿åçå表表示è°ç¨æ¶å»å®¢æ·ç«¯IDçå¿«ç
§ãåç»å¯¹å®¢æ·ç«¯éåçæ´æ¹ä¸ä¼å½±åè¿åçåè¡¨ãæ¤æ¹æ³æ¯çº¿ç¨å®å
¨çã</remarks> |
| | | /// <returns>å
å«å®¢æ·ç«¯IDç<see cref="IReadOnlyList{String}"/>ãå¦ææ²¡æå®¢æ·ç«¯æ³¨åï¼å表å°ä¸ºç©ºã</returns> |
| | | public IReadOnlyList<string> GetClientIds() |
| | | { |
| | | lock (_syncRoot) |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ£ç´¢ä¸æå®è®¾å¤æ è¯ç¬¦å
³èç客æ·ç«¯æ è¯ç¬¦ã |
| | | /// </summary> |
| | | /// <remarks>æ¤æ¹æ³æ¯çº¿ç¨å®å
¨çãå¦ææªæ¾å°è®¾å¤æ è¯ç¬¦ï¼æ¹æ³å°è¿ånullè䏿¯æåºå¼å¸¸ã</remarks> |
| | | /// <param name="deviceId">è¦æ£ç´¢å®¢æ·ç«¯æ è¯ç¬¦ç设å¤çå¯ä¸æ è¯ç¬¦ãä¸è½ä¸ºnullã</param> |
| | | /// <returns>䏿å®è®¾å¤æ è¯ç¬¦å
³èç客æ·ç«¯æ è¯ç¬¦ï¼å¦æä¸åå¨å
³èåè¿ånullã</returns> |
| | | public string? GetClientIdByDevice(string deviceId) |
| | | { |
| | | lock (_syncRoot) |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 弿¥åæå®è®¾å¤åéæ¶æ¯ã |
| | | /// </summary> |
| | | /// <remarks>妿æå®è®¾å¤æªæ³¨åææ æ³æ¾å°ï¼åè¿å <see langword="false"/>ã</remarks> |
| | | /// <param name="deviceId">ç®æ 设å¤çå¯ä¸æ è¯ç¬¦ãä¸è½ä¸ºnullæç©ºã</param> |
| | | /// <param name="message">è¦åéç»è®¾å¤çæ¶æ¯ãä¸è½ä¸ºnullã</param> |
| | | /// <returns>è¡¨ç¤ºå¼æ¥æä½çä»»å¡ãå¦ææ¶æ¯æååéï¼ä»»å¡ç»æä¸º <see langword="true"/>ï¼ |
| | | /// å¦å为 <see langword="false"/>ã</returns> |
| | | public Task<bool> SendToDeviceAsync(string deviceId, string message) |
| | | { |
| | | var clientId = GetClientIdByDevice(deviceId); |
| | |
| | | return SendToClientAsync(clientId, message); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éè¿TCPè¿æ¥å¼æ¥åæå®å®¢æ·ç«¯åéå¸¦å¸§çææ¬æ¶æ¯ã |
| | | /// </summary> |
| | | /// <remarks>妿客æ·ç«¯æªè¿æ¥æä¸åå¨ï¼æ¤æ¹æ³å°è¿å <see langword="false"/> ä¸ä¸åéæ¶æ¯ã |
| | | /// æ¶æ¯å°ä¼å
使ç¨å®¢æ·ç«¯é¦éçææ¬ç¼ç è¿è¡ç¼ç ï¼å¦å使ç¨é»è®¤ç¼ç ã |
| | | /// æ¤æ¹æ³å¯¹äºåä¸å客æ·ç«¯çå¹¶åè°ç¨æ¯çº¿ç¨å®å
¨çã</remarks> |
| | | /// <param name="clientId">è¦åéæ¶æ¯å°ç客æ·ç«¯çå¯ä¸æ è¯ç¬¦ãå¿
须对åºå·²è¿æ¥ç客æ·ç«¯ã</param> |
| | | /// <param name="message">è¦åéç»å®¢æ·ç«¯çææ¬æ¶æ¯ãä¸è½ä¸ºnullã</param> |
| | | /// <returns>è¡¨ç¤ºå¼æ¥æä½çä»»å¡ãå¦ææ¶æ¯æååéï¼ä»»å¡ç»æä¸º <see langword="true"/>ï¼ |
| | | /// å¦åï¼å¦æå®¢æ·ç«¯æªè¿æ¥æä¸åå¨ï¼ç»æä¸º <see langword="false"/>ã</returns> |
| | | public async Task<bool> SendToClientAsync(string clientId, string message) |
| | | { |
| | | TcpClient? client; |
| | |
| | | try |
| | | { |
| | | var ns = client.GetStream(); |
| | | var data = enc.GetBytes((message ?? string.Empty) + "\n"); |
| | | var framedMessage = BuildFramedMessage(message); |
| | | var data = enc.GetBytes(framedMessage); |
| | | await ns.WriteAsync(data, 0, data.Length); |
| | | } |
| | | finally |
| | |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 弿¥åææå·²è¿æ¥ç客æ·ç«¯åéæå®çæ¶æ¯ã |
| | | /// </summary> |
| | | /// <remarks>妿åæä¸ªå®¢æ·ç«¯åéæ¶æ¯æ¶åçé误ï¼å¼å¸¸å°è¢«æå¶å¹¶ç»§ç»åå
¶ä»å®¢æ·ç«¯å¹¿æã |
| | | /// 彿æåéæä½å®æåï¼æ¤æ¹æ³ç»æã</remarks> |
| | | /// <param name="message">è¦å¹¿æç»ææå®¢æ·ç«¯çæ¶æ¯ãä¸è½ä¸ºnullã</param> |
| | | /// <returns>è¡¨ç¤ºå¼æ¥å¹¿ææä½çä»»å¡ã</returns> |
| | | public async Task BroadcastAsync(string message) |
| | | { |
| | | List<TcpClient> clients; |
| | |
| | | |
| | | await Task.WhenAll(clients.Select(c => Task.Run(async () => |
| | | { |
| | | try { await SendAsync(c, message); } catch { } |
| | | try { await SendMessageAsync(c, message); } catch { } |
| | | }))); |
| | | } |
| | | |
| | | public static async Task SendAsync(TcpClient client, string message) |
| | | /// <summary> |
| | | /// éè¿ç½ç»æµå¼æ¥åæå®çTCP客æ·ç«¯åéå¸¦å¸§çææ¬æ¶æ¯ã |
| | | /// </summary> |
| | | /// <remarks>妿客æ·ç«¯ä¸ºnullææªè¿æ¥ï¼æ¤æ¹æ³å°ç«å³è¿åèä¸åéæ¶æ¯ã |
| | | /// æ¶æ¯å°ä½¿ç¨é
ç½®çææ¬ç¼ç è¿è¡ç¼ç å¹¶æ·»å 帧头åéè¿ç½ç»æµåéã</remarks> |
| | | /// <param name="client">è¦åéæ¶æ¯å°çTCP客æ·ç«¯ãå¿
é¡»å¤äºè¿æ¥ç¶æï¼å¦åæ¹æ³ä¸æ§è¡ä»»ä½æä½ã</param> |
| | | /// <param name="message">è¦åéç»å®¢æ·ç«¯çææ¬æ¶æ¯ãæ¶æ¯å¨ä¼ è¾åå°è¢«ç¼ç å¹¶æ·»å 帧头ã</param> |
| | | /// <returns>è¡¨ç¤ºå¼æ¥åéæä½çä»»å¡ã</returns> |
| | | private async Task SendMessageAsync(TcpClient client, string message) |
| | | { |
| | | if (client == null || !client.Connected) |
| | | { |
| | |
| | | } |
| | | |
| | | NetworkStream stream = client.GetStream(); |
| | | var data = Encoding.UTF8.GetBytes((message ?? string.Empty) + "\n"); |
| | | var framedMessage = BuildFramedMessage(message); |
| | | var data = _textEncoding.GetBytes(framedMessage); |
| | | await stream.WriteAsync(data, 0, data.Length); |
| | | } |
| | | } |