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

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

08.12.2016, 19:19. Показов 6466. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru