C# webstock

C# webstock 怎么给同一个网络下的指定的电脑发送消息,要详细点的过程我是新人,有源码最好谢谢,目前来说每次看到的同一台电脑的客户端的ip的端口号一直变动,所以怎么去给指定的电脑或者客户发送消息,(我想做的就是服务器给不同的客户推送不同的消息,现在发现同一个网关下的电脑区分不了谁是谁) remoteendpoint 一直在变动,我怎么知道是哪个客户哪个电脑登入的这个ip,我想固定到用户和电脑的ip进行推送消息

要实现 C# WebSocket 给同一网络下的指定电脑发送消息,需要以下步骤:

  1. 为每个客户端连接保留唯一的标识符,例如使用客户端的用户名或其他唯一标识符。可以在客户端建立连接时将该标识符传递给服务器。

  2. 服务器端维护一个集合,用于保存每个客户端连接的标识符和对应的 WebSocket 连接对象。

  3. 当服务器接收到要推送的消息时,遍历客户端连接的集合,根据需要匹配指定的电脑或客户端,并发送消息给匹配的连接。

下面是一个简单的示例代码,演示了如何实现此功能:


using System;
using System.Collections.Concurrent;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketServer
{
    public class WebSocketHandler
    {
        private ConcurrentDictionary<string, WebSocket> clients = new ConcurrentDictionary<string, WebSocket>();

        public async Task AcceptWebSocket(WebSocket webSocket, string clientId)
        {
            clients.TryAdd(clientId, webSocket);

            while (webSocket.State == WebSocketState.Open)
            {
                var buffer = new byte[1024];
                var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

                if (result.MessageType == WebSocketMessageType.Text)
                {
                    var message = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
                    Console.WriteLine($"Received message: {message}");

                    // 根据需要判断消息发往哪些客户端
                    // 例如,向特定客户端推送消息
                    if (clientId == "client1")
                    {
                        await SendMessageToClient(webSocket, "Hello client1!");
                    }
                }
                else if (result.MessageType == WebSocketMessageType.Close)
                {
                    break;
                }
            }

            clients.TryRemove(clientId, out _);
            await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
        }

        public async Task SendMessageToClient(WebSocket webSocket, string message)
        {
            var buffer = Encoding.UTF8.GetBytes(message);
            await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
        }

        public async Task SendMessageToAllClients(string message)
        {
            foreach (var client in clients)
            {
                await SendMessageToClient(client.Value, message);
            }
        }
    }
}


上述代码使用 ConcurrentDictionary 维护了客户端连接的标识符和对应的 WebSocket 对象。在接收到消息时,根据匹配逻辑发送消息给指定的客户端。

请注意,上述代码只是示例,并不包含完整的 WebSocket 服务器实现。你需要根据自己的需求进行适当的修改和扩展。

此外,为了确保能够准确区分不同的客户端,可以考虑使用身份验证等机制来验证客户端的身份,并将其与相应的 WebSocket 连接关联起来。这有助于确保消息被发送给正确的客户端。

希望这些信息对你有所帮助!如有更多问题,请随时提问。