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

时间:2019-01-08 16:28:07

标签: c# multithreading sockets server client

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

我尝试将每个加入服务器的客户端添加到列表中,然后使用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 个答案:

答案 0 :(得分:1)

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

您正在遍历clientSocket,但是您正在Send而不是clientclientSocket。如果您改为clientSocket.Send,则应该得到预期的行为(例如,发送给每个客户端而不是发送给一个客户端4次)。