Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
215 / 211 / 146
Регистрация: 20.11.2014
Сообщений: 1,184

Клиенты-сервер чат

27.06.2017, 22:19. Показов 4389. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть несколько компьютеров в одной локальной сети, необходимо на одном из них запустить программу - сервер, на остальных клиентов. Когда на клиентах будет происходить событие (допустим, просто нажатие кнопки на форме) серверу отправляется имя компьютера клиента и время нажатия. На сервере после принятия каждое сообщение пишется в БД mysql. Как это реализовать максимально просто и как реализовать запись в БД по очереди, чтоб не висло приложение, так как сообщение может придти разом от нескольких клиентов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2017, 22:19
Ответы с готовыми решениями:

Клиент-сервер. Чат на виртуальном сервере
Здравствуйте. Подскажите пожалуйста как реализовать чат клиент-сервер, если установить сервер на виртуальную машину, да так чтобы он...

Как пишется Клиент-Сервер (чат)?
Добрый день всем!!! Задали написать чат!!! Если честно,то не знаю вообще как написать!!! Подскажите книжку,с помощью которой можно...

Графический чат через многопоточный сервер
Есть многопоточный сервер и клиент, который может общаться сам с собой) Помогите сделать чат так, чтобы несколько клиентов могли общаться...

10
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
27.06.2017, 22:26
Цитата Сообщение от bbq Посмотреть сообщение
Как это реализовать максимально просто и как реализовать запись в БД по очереди, чтоб не висло приложение, так как сообщение может придти разом от нескольких клиентов?
Решить можно с помощью сокетов и взаимодействием с БД.
0
215 / 211 / 146
Регистрация: 20.11.2014
Сообщений: 1,184
27.06.2017, 22:49  [ТС]
так будет нормально или нужно еще что то?

сервер

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
  class Program
    {
        static int port = 8005; // порт для приема входящих запросов
    static void Main(string[] args)
    {
        // получаем адреса для запуска сокета
        IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("10.70.7.145"), port);
 
        // создаем сокет
        Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
            // связываем сокет с локальной точкой, по которой будем принимать данные
            listenSocket.Bind(ipPoint);
 
            // начинаем прослушивание
            listenSocket.Listen(10);
 
            Console.WriteLine("Сервер запущен. Ожидание подключений...");
 
            while (true)
            {
                Socket handler = listenSocket.Accept();
                // получаем сообщение
                StringBuilder builder = new StringBuilder();
                int bytes = 0; // количество полученных байтов
                byte[] data = new byte[256]; // буфер для получаемых данных
 
                do
                {
                    bytes = handler.Receive(data);
                    builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                }
                while (handler.Available > 0);
 
               // запись в базу builder.ToString()
                    
 
 
                // закрываем сокет
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
}

клиент

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
class Program
    {
        static int port = 8005; // порт сервера
        static string address = "10.70.7.145"; // адрес сервера
        static void Main(string[] args)
        {
            try
            {
                IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
 
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                // подключаемся к удаленному хосту
                socket.Connect(ipPoint);
                
 
                byte[] data = Encoding.Unicode.GetBytes("test message");
                socket.Send(data);
 
               
                // закрываем сокет
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
28.06.2017, 07:29
Цитата Сообщение от bbq Посмотреть сообщение
реализовать максимально просто
WCF-проще некуда.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
28.06.2017, 10:21
bbq, asp.net mvc signalr2. Много готовых чатов, высокоуровневый api. Юзайте гугл https://www.google.ru/search?n... 6o_4s_WQJM. Единственное клиент на js
0
Эксперт .NET
 Аватар для Usaga
14292 / 9377 / 1352
Регистрация: 21.01.2016
Сообщений: 35,338
28.06.2017, 10:23
cyb0rg_01, а чё сразу SignalR? Можно и чистый WebSocket.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
28.06.2017, 10:24
Usaga, смысл изобретать велосипед?
0
Эксперт .NET
 Аватар для Usaga
14292 / 9377 / 1352
Регистрация: 21.01.2016
Сообщений: 35,338
28.06.2017, 10:28
cyb0rg_01, К WebSocket можно цепляться клиентом из .NET (WebSocketClient). А вот можно ли так сделать с SignalR я хз. Кстати, для чата, наверное, не обязательно прямо ASP.NET приложение. Тут WCF бы не хуже подошёл.
0
215 / 211 / 146
Регистрация: 20.11.2014
Сообщений: 1,184
28.06.2017, 15:34  [ТС]
Как сделать, чтобы клиент все время мог отправлять сообщения серверу?
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
class Program
    {
        static int port = 8005; // порт сервера
        static string address = "ip"; // адрес сервера
        static void Main(string[] args)
        {
            try
            {
                
                    IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                // подключаемся к удаленному хосту
                socket.Connect(ipPoint);
                    Console.Write("Введите сообщение:");
                    string message = Console.ReadLine();
                    byte[] data = Encoding.Unicode.GetBytes(message);
                    socket.Send(data);
 
                    // получаем ответ
                    data = new byte[256]; // буфер для ответа
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0; // количество полученных байт
 
                    do
                    {
                        bytes = socket.Receive(data, data.Length, 0);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (socket.Available > 0);
                    Console.WriteLine("ответ сервера: " + builder.ToString());
                   
                
                // закрываем сокет
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
Так почему то не работает
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
class Program
    {
        static int port = 8005; // порт сервера
        static string address = "ip"; // адрес сервера
        static void Main(string[] args)
        {
            try
            {
                
                    IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                // подключаемся к удаленному хосту
                socket.Connect(ipPoint);
                while (true)
                {
                    Console.Write("Введите сообщение:");
                    string message = Console.ReadLine();
                    if (message == "exit") { break; }
                    byte[] data = Encoding.Unicode.GetBytes(message);
                    socket.Send(data);
 
                    // получаем ответ
                    data = new byte[256]; // буфер для ответа
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0; // количество полученных байт
 
                    do
                    {
                        bytes = socket.Receive(data, data.Length, 0);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (socket.Available > 0);
                    Console.WriteLine("ответ сервера: " + builder.ToString());
                }
                
                // закрываем сокет
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
код сервера
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
class Program
    {
        static int port = 8005; // порт для приема входящих запросов
    static void Main(string[] args)
    {
        // получаем адреса для запуска сокета
        IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("ip"), port);
 
        // создаем сокет
        Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
            // связываем сокет с локальной точкой, по которой будем принимать данные
            listenSocket.Bind(ipPoint);
 
            // начинаем прослушивание
            listenSocket.Listen(10);
 
            Console.WriteLine("Сервер запущен. Ожидание подключений...");
 
            while (true)
            {
                Socket handler = listenSocket.Accept();
                // получаем сообщение
                StringBuilder builder = new StringBuilder();
                int bytes = 0; // количество полученных байтов
                byte[] data = new byte[256]; // буфер для получаемых данных
 
                do
                {
                    bytes = handler.Receive(data);
                    builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                }
                while (handler.Available > 0);
 
                // запись в базу builder.ToString()
                Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + builder.ToString());
 
                 string message = "ваше сообщение доставлено";
                 data = Encoding.Unicode.GetBytes(message);
                 handler.Send(data);
 
 
                    // закрываем сокет
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
28.06.2017, 15:39
Цитата Сообщение от Usaga Посмотреть сообщение
Тут WCF бы не хуже подошёл.
Стопицот. Причем если задействовать еще параллельно и WCF HTTP и две конечных точки, то можно и из браузере обращаться к серверу, ну и из клиентского приложения, естественно.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.06.2017, 15:56
Цитата Сообщение от cyb0rg_01 Посмотреть сообщение
смысл изобретать велосипед?
возможно в обучении. Когда все нужное выведено в api, можешь не знать о подводных камнях.

Цитата Сообщение от bbq Посмотреть сообщение
Как сделать, чтобы клиент все время мог отправлять сообщения серверу?
обычно прослушивание выносят в отдельный поток, чтобы он ничего не блокировал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2017, 15:56
Помогаю со студенческими работами здесь

Как создать многопользовательский чат (Сервер-клиент)
Как создать многопользовательский чат(Сервер-клиент)?

Чат TCP Консоль сервер + WinForm клиент
Чат TCP сервер консоль + WinForm клиент Есть код где Консоль сервер+ Консоль клиент создает Чат но когда это я перевел на Консоль...

Довести до ума чат клиент/сервер, написанный по видеоинструкции
С помощью видео из Youtube-а я написал код для сервера и самого клиента, но вот как довести до ума - без понятия :( Помогите, пожалуйста)))...

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

Консольный чат. Почему сервер не пересылает сообщения клиентам?
пожалуйста помогите понять почему не работает мой консольный чат! сервер using System; using System.Collections.Generic; using...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru