122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276

Многопользовательский чат на socket. Не обновляется список пользователей

29.12.2013, 18:05. Показов 3319. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пишу многопользовательский чат на socket (уже написал с wcf и он работает). сообщения обмениваются но список клиентов обновляется только у первого и у последнего а у остальных не обновляется. посмотрите пожалуйста где я ошибся или я все не правильно делаю?
код обновления списка клиентов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void UpdateUsers(Socket sock)
        {
            List<byte> bytes = new List<byte>();
            bytes.AddRange(BitConverter.GetBytes((int)Commands.UpdateUsers));
            bytes.AddRange(BitConverter.GetBytes(clients.Count));
            foreach (var item in clients)
            {
                byte[] b = Encoding.UTF8.GetBytes(item.Key);
                bytes.AddRange(BitConverter.GetBytes(b.Length));
                bytes.AddRange(b);
            }
 
            if (sock == null)
                foreach (var item in clients)
                {
                    Send(item.Value, bytes);
                }
            else
                Send(sock, bytes);
        }
метод отправки
C#
1
2
3
4
5
6
private void Send(Socket socket, List<byte> bytes)
        {
            byte[] b = BitConverter.GetBytes(bytes.Count);
            bytes.InsertRange(0, b);
            socket.Send(bytes.ToArray());
        }
здесь в клиенте обновляю список клиентов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void UpdateUsers(byte[] bytes)
        {
            int pos = 4;
            int count = BitConverter.ToInt32(bytes, pos); pos += 4;
 
            List<string> users = new List<string>();
 
            for (int i = 0; i < count; i++)
            {
                int ln = BitConverter.ToInt32(bytes, pos); pos += 4;
                string name = Encoding.UTF8.GetString(bytes, pos, ln); pos += ln;
                users.Add(name);
            }
 
            var handler = Interlocked.CompareExchange(ref this.UpdateUsersList, null, null);
 
            if (handler != null)
            {
                handler(this, new ChatArgs(true, users));
            }
        }
прикрепил проект
ChatSocket.rar
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2013, 18:05
Ответы с готовыми решениями:

Не обновляется список пользователей
У меня возникла проблема, в списке пользователей. Список не обновляется если в него зайти повторно, после того как удалил одного...

Многопользовательский чат
Подскажите, как в таком чате сделать так, чтобы к серверу могли подключаться несколько клиентов, и сообщения получаемые сервером,...

Многопользовательский чат
Продолжая тему: https://www.cyberforum.ru/c-linux/thread739166.html . Чат подправил и все заработало, но не знаю как реализовать...

14
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
30.12.2013, 09:26  [ТС]
ни кто не знает?
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 14:09
ablai96, Лучше используй команды... Как у меня... При поступлении команды - ты её разделаешь на ключ и текст... По ключу определяешь что нужно сделать в обратку клиенту, а если нужно то работаешь с текстом...

Добавлено через 21 секунду
ablai96, И мой совет... Используй MySQL
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 14:13
Вот мой проект... Там в сервере если хочешь поменяй адрес(localhost) до MySQL на мой внешний адрес
88.147.243.148 - пока что такой... И попробуй - авторизация + рега + подсчет ресурсов...
Вложения
Тип файла: zip MyServer-Client.zip (234.2 Кб, 60 просмотров)
0
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
30.12.2013, 14:14  [ТС]
SkoTi, я использую базу ms sql, командами я итак пользуюсь. первые 4 байта это размер входящих данных и следующие 4 байта команда. потом данные идут
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 14:21
ablai96, лучше мускул... чем ms sql.... По многим соображениям... А если уж так неимется с извращенями то попробуй ещё MySQL Lite - кстати... Скайп на нем работает.

А вобще регитсрацию пользователей я буду делать так -
C#
1
2
reader["SkoT"].ReadLine();
sWriter["SkoT"].WriteLine("Бла бла бла");
И вот чтение и отправка с потока к SkoT пользователю))))


Сервер пока с клиентом черновые)) Это черновик эксперементов так скажим)
0
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
30.12.2013, 14:24  [ТС]
SkoTi, у меня не работает только отправка всем пользователям обновленный список

Добавлено через 37 секунд
SkoTi, я просто использую Entity framework с базой
1
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 14:43
ablai96, И по этому ваш проект весит 8мб да? Представь те вы делаете альтернативу ICQ или скайпа....
Задача: сделать чато обмен при этом что бы пользователю качать было минимум клиента и клиент запускался без требования каких либо библиотек сторонних и даже NET использовал не выше 2.0 так как есть до сих пор пользователи Win XP
+ А если вам понадобится ещё с 10яток функций добавить? Например - удаление и добовление в друзья... и многое другое м? Переписывать весь код придется?

Я же пока что не знаю - как мне бы сделать общий чат а не приватный что бы сервер сообщение всем рассылал...

Добавлено через 3 минуты
Что касается вашего проекта... Дам совет....

У вас же есть лист пользлвателей? Сделйте таймре у клиента что бы каждые 2 сек или 5 сек запрашивал список пользователей - А на сервере с помощью forache сделайте как у меня текстовую строку в виде - SkoT;ablai96;mikael и т д... А в клиенте принять и с помощью Split(';') разбить обратно на массив и перевести его в лист список... Сложности - 0.... Ну или на сервере проводить отправку каждые 5 сек каждому потоку туже самую текстовую строку насильно.... Но рискуешь нарватся на исключение.

Добавлено через 21 секунду
А лучше постучи в скайп - d1ment0rr

Добавлено через 4 минуты
ablai96, Помни! Клиент пользователя должен сам захотеть принять а не сервер спрашивать клиента на то что хочет ли он принять список пользователей...
0
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
30.12.2013, 14:50  [ТС]
SkoTi, клиент весит 30 КБ, это весь проект. а списки я по байтам передаю и собираю с этим все нормально, но только первый клиент принимает список а остальные не принимают

Добавлено через 1 минуту
я уже писал такой же чат на wcf с duplex-ными соединениями там все работает
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 14:53
Ты или пробуй как тебе говарят сделать или зачем спрашиваешь?

Я тебе уже дал резонный ответ что не сервер должен навязывать что то а клиент должен запрашивать и получать ответ. Попробуй сделать в клиенте запрос на список пользователей а на сервере отвечай текущим списком пользователей.

Добавлено через 2 минуты
ablai96, иначе это лишняя перегрузка сервера... Посмотри как сделаны серверы World Of wacraft... где онлайны по 5к и обрабатывается не просто чат а все действия юзера и расчитываются и передаются определённым юзерам действия соседних юзеров и многое другое... Представь если бы не клиент отпровлял действия юзера а сервер запрашивал последние действия с каждого то какая бы нагрузка была м?
0
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
30.12.2013, 15:02  [ТС]
SkoTi, если каждые 5 сек обновлять список когда пользователи не вошли тогда и будут перегрузка из за того что все клиенты обновляют список контактов. а у меня оно обновляется если только кто то вошел или вышел. всех клиентов и так слушаю я их по сокету, но зачем обновлять список если там нет изменений?
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 15:04
ablai96, но если у тебя онлайн 5к или 50к то сколько же запросов будет в сек?
0
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
30.12.2013, 15:07  [ТС]
SkoTi, в этом случае разницы не будет, так как запросы будут в одинаковом количестве приходить как и ответы сервера
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 15:09
ablai96, Тогда пробуй тем же способом которым и сообщения отправляешь отправлять.[/CSHARP]
0
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
30.12.2013, 15:49  [ТС]
исправил, я оказывается не правильно байты обработал когда обновлял их
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2013, 15:49
Помогаю со студенческими работами здесь

Многопользовательский чат
Пишу элемент многопользовательского чата со страницы http://pblog.ru/?p=100 Просьба исправить ошибки в этом коде: Процедура...

Многопользовательский чат в батнике
Привет) Предлагаю свою версию cmd чата через общую папку. Давно задался вопросом - Как создать многопользовательский чат в батнике? ...

Многопользовательский TCP чат
Для отправки сообщений юзаю PrintWriter, поэтому flush'ить не надо. Вижу на сервере что юзеры подсоединяются, но сообщения не...

Создать многопользовательский чат
Давно интересовался созданием мессенджера в командере. Создать мессенджер на самом то деле проще простого @echo off :A Cls ...

Многопользовательский чат на Batch
Привет всем, имеется исходник: @rem BatChat @echo off cls pushd &quot;%~dp0&quot; echo Current DIR: &quot;%CD%&quot; if &quot;%~1&quot; ==...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru