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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, имеется вот такой сервер на 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2016, 19:19
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Добавлено через 2 минуты
С этим разобрался)
Цитата Сообщение от Armando111 Посмотреть сообщение
исключение: Ссылка на объект не указывает на экземпляр объекта.
0
08.12.2016, 23:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2016, 23:11
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru