С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/30: Рейтинг темы: голосов - 30, средняя оценка - 4.83
 Аватар для Armando111
2 / 1 / 2
Регистрация: 07.02.2014
Сообщений: 246

Сокеты. Отправка сообщений всем клиентам или только одному

08.12.2016, 19:19. Показов 6415. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, имеется вот такой сервер на C#:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
 
namespace ConsoleServer
{
    public struct client_attr
    {
        public int count;
        public string ip;
        public string name;
    }
    public struct connections
    {
        public string firstClient;
        public string secondClient;
        public string[] msg;
    }
    class Program
    {
        public static string data = null;
        public static bool exit = false;
        static int count = 0;
        static bool spisok = false;
        static string[] clients = new string[10];
        static String host = System.Net.Dns.GetHostName();
       
      
        public static void start_server()
        {
            try
            {
                System.Net.IPAddress ip = System.Net.Dns.GetHostByName(host).AddressList[0];
                IPAddress localAddress = IPAddress.Parse(ip.ToString());
 
                IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 65);
 
                Socket sListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
                sListener.Bind(ipEndpoint);
                sListener.Listen(1);
 
                while (true)
                {
                    //Invoke(new AddMessageDelegate(LogAdd), new object[] { "Ожидаем соединение. " + ip.ToString() + ":65" + "\n" });
                    Console.WriteLine("Ожидаем соединение. " + ip.ToString() + ":65");
 
                    Socket handler = sListener.Accept();
 
                    Thread Thread2 = new Thread(delegate() { obs(handler); });
                    Thread2.Start();
                    if (exit == true)
                    {
                        handler.Shutdown(SocketShutdown.Both);
                        handler.Close();
                        Thread2.Abort();
                        break;
                    }
                }
 
            }
            catch (Exception ex)
            {
               // Invoke(new AddMessageDelegate(LogAdd), new object[] { ex.ToString() + "\n" });
                Console.WriteLine(ex.ToString());
            }
        }
        static void reciv(Socket handler)
        {
            try
            {
                byte[] bytes = new byte[1024];
                int bytesRec = handler.Receive(bytes);
                data = Encoding.UTF8.GetString(bytes, 0, bytesRec);
            }
            catch
            {
                // Invoke(new AddMessageDelegate(LogAdd), new object[] { "Соединение прервано" });
                Console.WriteLine("Соединение прервано");
            }
        }
        static void obs(Socket handler)
        {
            client_attr[] client1 = new client_attr[30];
            
            count += 1;
            clients[count] = ((IPEndPoint)handler.RemoteEndPoint).Address.ToString();
            while (true)
            {
                Thread thread3 = new Thread(delegate() { reciv(handler); });
                thread3.Start();
 
                //Invoke(new AddMessageDelegate(LogAdd), new object[] { count + "\n" });
                //Invoke(new AddMessageDelegate(LogAdd), new object[] { data + "\n" });
                //Console.WriteLine(count);
               // Console.WriteLine(data);
                    if (data == "exit")
                    {
 
                        //Invoke(new Action(() => { listBox1.Items.RemoveAt(client1[count].count); }));
                        client1[count].count = -1;
                        client1[count].ip = null;
                        client1[count].name = null;
                        handler.Shutdown(SocketShutdown.Both);
                        handler.Close();
                       // Invoke(new AddMessageDelegate(LogAdd), new object[] { "Соединение завершено\n" });
                        Console.WriteLine("Соединение завершено");
                        Console.WriteLine("disconnect" + ":" + client1[count].name + "::" + count);
                        break;
                    }
                    else if (client1[count].name == null)
                    {
                        client1[count].ip = ((IPEndPoint)handler.RemoteEndPoint).Address.ToString();
                        client1[count].name = data;
                        client1[count].count = count;
                        //byte [] list_mem = new byte[listBox1.Items.Count];
                        handler.Send(Encoding.UTF8.GetBytes(client1[count].name+""));
 
                        // handler.Send(Encoding.UTF8.GetBytes();
 
                       // Invoke(new Action(() => { listBox1.Items.Add(client1[count].name); }));
                       // Invoke(new AddMessageDelegate(LogAdd), new object[] { "Клиент " + client1[count].name + " с IP: " + client1[count].ip + " подключился.\n" });
                        Console.WriteLine("Клиент " + client1[count].name + " с IP: " + client1[count].ip + " подключился.");
                        
                    }
                    else if (client1[count].name != null)
                    {
                        for (int i = 1; i < count+1; i++)
                        {
                        // if (client1[0].name != client1[count].name)
                        // {
                            if (spisok == false)
                            {
                                handler.Send(Encoding.UTF8.GetBytes(i+":"+client1[i].name));
                                spisok = true;
                                // Invoke(new AddMessageDelegate(LogAdd), new object[] { client1[count].name });
                                //Console.WriteLine(client1[count].name);
                                // }
                            }
                        }
                       
                    }
                    else if (data.IndexOf("connect") >= 0)
                    {
                        connections[] connect = new connections[1];
                        int start = data.IndexOf(":");
                        int end = data.IndexOf("::");
                        int len = end - start;
                        connect[0].firstClient = data.Substring(start, len);
                        start = data.IndexOf("::");
                        end = data.IndexOf(":::");
                        len = end - start;
                        connect[0].secondClient = data.Substring(start, len);
                       // Invoke(new AddMessageDelegate(LogAdd), new object[] { connect[0].firstClient + "" + connect[0].secondClient });
                        Console.WriteLine(connect[0].firstClient + "" + connect[0].secondClient);
                    }
       
                Thread.Sleep(500);
            }
        }
        static void Main(string[] args)
        {
            start_server();
        }
Суть вопроса: Как мне отправлять какое то всем клиентам одновременно, а другое сообщение определённому клиенту.

Добавлено через 1 час 11 минут
Как мне отправить список подключенных к серверу клиентов, всем клиентам?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2016, 19:19
Ответы с готовыми решениями:

Отправка сообщений всем клиентам
Здравствуйте. Создал многопоточный сервер, но никак не могу разобраться с тем, чтобы сервер отправлял сообщение всем клиентам а не только...

Отправка сообщений всем подключенным клиентам
Как реализовать отправку всех сообщений которые поступили на сервер, всем клиентам(потокам)? Пытался реализовать внутри класса...

Сокеты: отправка результата нескольким клиентам
Здравствуйте. Как реализовать отправку результата с сервера на два клиента? Проблема в том, что отправка идёт только тому, кто последний...

8
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
08.12.2016, 19:28
Цитата Сообщение от Armando111 Посмотреть сообщение
Как мне отправить список подключенных к серверу клиентов, всем клиентам?
Armando111, могу посоветовать (если это возможно) на WCF, там ваша задача решается быстрее и проще.
Затраты на изучение окупятся скоростью дальнейшей разработки.
0
 Аватар для Armando111
2 / 1 / 2
Регистрация: 07.02.2014
Сообщений: 246
08.12.2016, 21:46  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Armando111, могу посоветовать (если это возможно) на WCF, там ваша задача решается быстрее и проще.
Затраты на изучение окупятся скоростью дальнейшей разработки.
Спасибо, посмотрю на досуге) Но сейчас нужно, что то с этим сделать.

Добавлено через 2 часа 16 минут
Кто нибудь подскажет, как это сделать?
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
08.12.2016, 21:51
Цитата Сообщение от Armando111 Посмотреть сообщение
Суть вопроса: Как мне отправлять какое то всем клиентам одновременно, а другое сообщение определённому клиенту.
Как отправлять всем сразу? Сохранять подключившихся клиентов в коллекцию, затем в цикле отправлять всем
0
 Аватар для Armando111
2 / 1 / 2
Регистрация: 07.02.2014
Сообщений: 246
08.12.2016, 22:00  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Сохранять подключившихся клиентов в коллекцию, затем в цикле отправлять всем
А примерчик есть какой нибудь?
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
08.12.2016, 22:06
Ну вы же подключившейся сокет передаете в обработчик, и сохраняйте его в локальный кеш

C#
1
2
3
4
5
List<Socket> _clientSockets;
 
...
 
_clientSockets.Add(socket);
0
 Аватар для Armando111
2 / 1 / 2
Регистрация: 07.02.2014
Сообщений: 246
08.12.2016, 22:36  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Ну вы же подключившейся сокет передаете в обработчик, и сохраняйте его в локальный кеш
Ага, хорошо, а что дальше делать?
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
08.12.2016, 22:42
Я же написал выше, когда вы хотите отпраить все сообщение - проходите циклом по всему списку и отправялете данные всем сокетам
0
 Аватар для Armando111
2 / 1 / 2
Регистрация: 07.02.2014
Сообщений: 246
08.12.2016, 23:11  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Ну вы же подключившейся сокет передаете в обработчик, и сохраняйте его в локальный кеш
C#
1
clientSocket.Add(handler);
исключение: Ссылка на объект не указывает на экземпляр объекта.

Добавлено через 2 минуты
С этим разобрался)
Цитата Сообщение от Armando111 Посмотреть сообщение
исключение: Ссылка на объект не указывает на экземпляр объекта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2016, 23:11
Помогаю со студенческими работами здесь

PHP Sockets отсылка сообщений всем клиентам
Недавно начал изучать PHP и пишу игру. Клиент на flash сервер на PHP. К серверу подключаются несколько клиентов и на сервере я сохраняю их...

Отправка всем клиентам
Что бы с сервера - server=socket.socket() отправить всем клиентам сообщение нужно использовать server.send()?

Отправка сообщения всем клиентам
Пишу (пробую) чат на сокетах. Клиент на андроиде. И не могу уже день разобратся с проблемой отправки сообщения всем клиентам. Я пробовал...

Отправка и получение сообщений через сокеты
Для начала , вот статья с аналоговым примером. Вот метод для получения сообщений : void Listen(CancellationToken CancellToken){ ...

ICQ отправка сообщений через сокеты
Ищу пример логина на сервер ICQ и отправки сообщений через сокеты. Где можно посмотреть реализацию или хотя бы найти описание протокола?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru