C # Как отправить данные всем клиентам, подключенным к моему серверу? - PullRequest
0 голосов
/ 08 января 2019

Итак, я пытаюсь создать приложение чата, но я новичок в сокетах. Я следовал руководству по созданию сервера и клиента, однако сервер не передает данные, отправленные с одного клиента, каждому клиенту, подключенному к нему. Вместо этого он только передает его клиенту, который отправил данные.

Я попытался добавить каждого клиента, который присоединяется к серверу, в список, а затем с помощью цикла 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 голосов
/ 08 января 2019

В

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

Вы зацикливаетесь на clientSocket s, но вы Send используете client, а не clientSocket. Если вместо этого вы делаете clientSocket.Send, вы должны получить ожидаемое поведение (например, отправить каждому клиенту вместо одного клиента 4 раза).

...