C# 如何向连接到我的服务器的所有客户端发送数据?

Posted

技术标签:

【中文标题】C# 如何向连接到我的服务器的所有客户端发送数据?【英文标题】:C# How do I send data to all clients connected to my server? 【发布时间】:2019-06-03 09:16:26 【问题描述】:

所以我正在尝试创建一个聊天应用程序,但我是套接字新手。我按照教程创建了服务器和客户端,但是,服务器不会将从一个客户端发送的数据广播到连接到它的每个客户端。相反,它只将其广播给发送数据的客户端。

我尝试将加入服务器的每个客户端添加到列表中,然后使用foreach 循环将从一个客户端接收到的数据发送到列表中的每个客户端。然而,这并没有奏效。我怀疑错误在foreach 循环中,但我不完全确定。

这是我的服务器代码:

class Program

    public static List<Socket> connectedClient = new List<Socket>();
    public static Socket clientSocket = default(Socket);

    static void Main(string[] args)
    

        int port = 13000;
        string IpAddress = "127.0.0.1";

        Socket serverListener = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(IpAddress), port);
        serverListener.Bind(ep);
        serverListener.Listen(0);
        Console.WriteLine("Server running");

        Program p = new Program();

        int counter = 0;
        while (true)
        
            counter++;
            clientSocket = serverListener.Accept();
            connectedClient.Add(clientSocket);
            Console.WriteLine(counter + " Client joined");

            Thread clientThread = new Thread(new ThreadStart(() => 
            p.User(clientSocket)));
            clientThread.Start();
        
    

    public void User(Socket client)
    
        while (true)
        
            byte[] msg = new byte[1024];
            int size = client.Receive(msg);
            Console.WriteLine("Client>> " + 
            System.Text.Encoding.ASCII.GetString(msg, 0, size));

            //the loop that i tried to implement
            foreach(Socket clientSocket in connectedClient)
            
                client.Send(msg, 0, size, SocketFlags.None);
            
        
    

服务器不会向所有客户端广播一次消息,而是将消息发送回发送消息的客户端,但要乘以有多少个客户端。

例如:如果有 4 个客户端连接到服务器,并且一个客户端发送消息 "Hello",则服务器将返回 "HelloHelloHelloHello",但只会发送给发送 "Hello" 的客户端。

【问题讨论】:

【参考方案1】:

foreach(Socket clientSocket in connectedClient)
    
        client.Send(msg, 0, size, SocketFlags.None);
    

你正在循环clientSockets,但你是Sending client,而不是clientSocket。如果您改为使用clientSocket.Send,您应该会得到预期的行为(例如,发送给每个客户端而不是发送给一个客户端 4 次)。

【讨论】:

非常感谢。

以上是关于C# 如何向连接到我的服务器的所有客户端发送数据?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 中的 Socket.IO 集群,多个节点未发送给所有客户端

C# - 关于服务器向客户端发送推送通知的设计问题 - 如何实现?

SSE Emitter:管理超时和完成()

服务器和客户端之间的 Xamarin C# 数据

如何从 C# 连接到 HyperSQL DB

C# - 连接到 (RAS) *** 时如何获取 IP 地址