Многопользовательский чат на C#

1141
14 марта 2017, 12:07

Добрый день.

Может кто подскажет, как должен функционировать сервер. Я вижу этот процесс так : у сервера есть список всех сокетов(клиентов) и клиентов сервер обрабатывает (добавляет в лист, принимает сообщения) в потоке. Еще вопрос, как сделать так, чтобы сервер принимал сообщения, когда клиент находится на другом ПК в локальной сети. Спасибо

P.S. Как сделать так , что у меня 1 сервер и много клиентов работают , подключенных к нему (протокол , общая организация) Все примеры в интернетах, которые видел, сделаны на основе UDP и без серверной части. (клиент-клиент) Код. Сервер (запускается в потоке)

            IPEndPoint endPoint =  new IPEndPoint(IPAddress.Parse(localIP), port);
            serverSocket.Bind(endPoint);
            while (true)
            {
                StringBuilder builder = new StringBuilder();
                int lengthOfBytes = 0; // количество полученных байтов
                byte[] data = new byte[256]; // буфер для получаемых данных
                EndPoint remoteIP = new IPEndPoint(IPAddress.Any, 0);
                do
                {
                    lengthOfBytes = serverSocket.ReceiveFrom(data,ref remoteIP);
                    builder.Append(Encoding.Default.GetString(data, 0, lengthOfBytes));
                } while (serverSocket.Available > 0);
                fullRemoteIp = remoteIP as IPEndPoint;
                Console.WriteLine("{0} , {1} : {2} ", fullRemoteIp.Address.ToString(), fullRemoteIp.Port.ToString(), builder.ToString());
                data = Encoding.Default.GetBytes("Доставлено");
                serverSocket.SendTo(data, remoteIP);

Клиент. Клиент(Отправка по клику кнопки)

        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(LocalIP), Port);
        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
        try
        {
            client.Connect(endPoint);
            commonWindow.Text += "Отправка" + Environment.NewLine;
            Int32 lengthInBytes = 0;  
            Byte[] data = new Byte[256]; 
            StringBuilder builder = new StringBuilder();
            data = Encoding.Default.GetBytes(messageWindow.Text);
            lengthInBytes = client.Send(data);
            data = new Byte[256];
            do
            {
                lengthInBytes = client.Receive(data);
                builder.Append(Encoding.Default.GetString(data));
            } while (client.Available > 0);
            if (lengthInBytes != 0)
            {
                commonWindow.Text += builder.ToString() + Environment.NewLine;
            }
Answer 1

В отдельном потоке ставишь прослушку на порт (Для того что бы программа не висла в ожидании сообщения). И все это дело зацикливаешь. Когда сообщение пришло выкидываешь его в чат. А на счет сервера. Используй UDP трансляцию. Все кто подключится к серверу будут получать трансляцию всех сообщений которые были высланы на сервер.

READ ALSO
C# WinForms. Бесконечный длинны компонент

C# WinForms. Бесконечный длинны компонент

Опишу идею: Допустим есть RichTextBoxТуда можно писать сколько угодно строк, и по мере роста строк, будет расти ScrollBar компонента

296
Генерация ссылки ASP.NET MVC

Генерация ссылки ASP.NET MVC

Добрый вечер

352
Docker как песочница

Docker как песочница

Как известно вNet Core нет AppDomain

276
Занесение в раздел реестра данных при инсталляции программы

Занесение в раздел реестра данных при инсталляции программы

Во время инсталляции msi-пакета, исполняется файл sharpTestexe

300