Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
ablai96
119 / 117 / 47
Регистрация: 14.09.2012
Сообщений: 276
Завершенные тесты: 6
1

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

29.12.2013, 18:05. Просмотров 1654. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2013, 18:05
Ответы с готовыми решениями:

Многопользовательский чат на TcpClient
Решил написать чат. сервер: using System; using System.Collections.Generic; using...

Многопользовательский голосовой чат
Здравствуйте, нужна помощь в написании многопользовательского голосового чата. Я создал сервер на...

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

Добавлено через 2 минуты
ablai96, иначе это лишняя перегрузка сервера... Посмотри как сделаны серверы World Of wacraft... где онлайны по 5к и обрабатывается не просто чат а все действия юзера и расчитываются и передаются определённым юзерам действия соседних юзеров и многое другое... Представь если бы не клиент отпровлял действия юзера а сервер запрашивал последние действия с каждого то какая бы нагрузка была м?
0
ablai96
119 / 117 / 47
Регистрация: 14.09.2012
Сообщений: 276
Завершенные тесты: 6
30.12.2013, 15:02  [ТС] 11
SkoTi, если каждые 5 сек обновлять список когда пользователи не вошли тогда и будут перегрузка из за того что все клиенты обновляют список контактов. а у меня оно обновляется если только кто то вошел или вышел. всех клиентов и так слушаю я их по сокету, но зачем обновлять список если там нет изменений?
0
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 15:04 12
ablai96, но если у тебя онлайн 5к или 50к то сколько же запросов будет в сек?
0
ablai96
119 / 117 / 47
Регистрация: 14.09.2012
Сообщений: 276
Завершенные тесты: 6
30.12.2013, 15:07  [ТС] 13
SkoTi, в этом случае разницы не будет, так как запросы будут в одинаковом количестве приходить как и ответы сервера
0
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 15:09 14
ablai96, Тогда пробуй тем же способом которым и сообщения отправляешь отправлять.[/CSHARP]
0
ablai96
119 / 117 / 47
Регистрация: 14.09.2012
Сообщений: 276
Завершенные тесты: 6
30.12.2013, 15:49  [ТС] 15
исправил, я оказывается не правильно байты обработал когда обновлял их
0
30.12.2013, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2013, 15:49

Многопользовательский чат по WebSocket
Здравствуйте, ищу пример серверного (SuperWebSocket) и пользовательского (WebSocket4Net) ПЗ,...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru