Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2011, 13:40   #681
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Добрый день.
Смотрел Ваш пример чата (Multy-user on-line chat (Private)).
Хотелось бы узнать:
1.Если запустить сервер, а потом подключать клиенты, то на 35-ом соединении у клиентов перестают отображаться Ники в ListView.На 36 соединении виден только один Ник во всех 36 клиентах.Почему это происходит и как исправить?
2.Как сделать, чтобы у клиентов не моргал список Ников в ListView при подключении нового клиента, когда их много?
Интервал таймера уменьшил до 1 мс.

Буду очень признателен за ответы!

Последний раз редактировалось werrey; 04.09.2011 в 13:50.
werrey вне форума Ответить с цитированием
Старый 04.09.2011, 15:35   #682
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от werrey Посмотреть сообщение
1.Если запустить сервер, а потом подключать клиенты, то на 35-ом соединении у клиентов перестают отображаться Ники в ListView.На 36 соединении виден только один Ник во всех 36 клиентах.Почему это происходит и как исправить?
Обратите внимание на цикл приема строки пользователей на стороне клиента, и конкретно на переменную j. Если ее тип по прежнему Byte, то обработать строку из больше чем 256 (+/- сдвиги) символов клиент не сможет. Если не хочется искать такие узкие места, можно просто изменить тип всех числовых переменных на Integer, ...но это порождает привычку варварски тратить ресурсы.

Цитата:
Сообщение от werrey Посмотреть сообщение
2.Как сделать, чтобы у клиентов не моргал список Ников в ListView при подключении нового клиента, когда их много?
Интервал таймера уменьшил до 1 мс.
Я не рассчитывал на то, что простейшая учебная программа станет основой какого-нибудь серьезного продукта, поэтому все механизмы определения параметров пользователей носят универсальный характер, теряя при этом в скорости из-за стандартного способа обновления информации.

Когда подключается/отключается пользователь, сервер шлет полный пакет всех присутствующих, но не выборочно, кто именно подключился или отключился. Процедура отображения ников у клиента в поле TListWiew всегда первым делом очищает весь список и создает новый. Именно эта структура вызывает мерцание при большом количестве строк, кроме того, что содержимое является типом String, так же не отличающимся в скорости считывания/обработки.

Выход - воспользоваться индексом Index записи TListWiew. Пусть клиент примет строчку, и начиная с индекса 1 (0 - сервер) изменит Caption строки, если оно отличается от прежнего. Если число клиентов увеличилось по сравнению с прежним списком, то идет команда добавления новой записи, а если уменьшилось, то последней командой будет удаление ненужной строки в конце списка.

Интервал таймера лучше оставить 100 мс или 200, от него зависит степень устойчивости чата к пользователям-дятлам.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 04.09.2011 в 15:38.
Beermonza вне форума Ответить с цитированием
Старый 04.09.2011, 16:58   #683
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Большое спасибо!
Первый вопрос решился легко.
А вот со вторым вопросом (Как сделать, чтобы у клиентов не моргал список Ников в ListView при подключении нового клиента, когда их много?) - что-то мне не разобраться. Если не трудно Вам и будет время, напишите подробный примерчик пожалуйста.

Заранее благодарю.
werrey вне форума Ответить с цитированием
Старый 04.09.2011, 19:43   #684
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Подробно могу дать только теоретически, а код придется написать самостоятельно.

Выход на уровень индексов записи и содержимого строки: UserListView.Items.Item[n].Caption

n - счетчик записей. Смотрим прием строки пользователей у клиента, это событие сокета ClientSocketRead, обработка значения 2 в case. Очистка списка UserListView.Items.Clear уже не понадобится, разве что только при отключении/переподключении клиента. Заполнение списка строками происходит вот здесь:

Код:
// добавим в UserListView строку
UItems := UserListView.Items.Add;
UItems.Caption := Copy(nettext, pos, x-1);
Нужна проверка Count (число записей) списка UserListView, если он больше текущего значения n, значит обращение к записи по индексу возможно, меняем Caption и добавляем к n единицу, ...если меньше, то нужно добавлять запись. Всегда имеем в виду, что Count содержит число фактических записей, а обращение через Item[n] начинается с 0.

По окончании цикла замены Caption списка нужен нисходящий цикл от конечной записи (Count-1) до последней заполненной по списку (n) с удалением записи из списка.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 24.03.2012, 20:40   #685
saturn63
 
Регистрация: 24.03.2012
Сообщений: 4
По умолчанию

Попробовал сделать чат. Всё сделал как в описании, а друзья не могут ко мне к серверу подключиться. Всё также - вводят мой IP и порт сервера, а им пишет Ansychrous socket error 10060
Что не так? В чём ошибка?
Подскажите пожалуйста!
saturn63 вне форума Ответить с цитированием
Старый 04.04.2012, 21:06   #686
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от saturn63 Посмотреть сообщение
Попробовал сделать чат. Всё сделал как в описании, а друзья не могут ко мне к серверу подключиться. Всё также - вводят мой IP и порт сервера, а им пишет Ansychrous socket error 10060
Что не так? В чём ошибка?
Подскажите пожалуйста!
Большая вероятность, что ваш IP-адрес маскирует провайдер. Для удачного коннекта сервер должен быть на белом IP-адресе, спросите у повайдера.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 19.09.2012, 16:59   #687
skew
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 2
По умолчанию

Цитата:
Сообщение от saturn63 Посмотреть сообщение
Попробовал сделать чат. Всё сделал как в описании, а друзья не могут ко мне к серверу подключиться. Всё также - вводят мой IP и порт сервера, а им пишет Ansychrous socket error 10060
Что не так? В чём ошибка?
Подскажите пожалуйста!
тоже самое получается. сам к себе присоединяюсь на внутренний IP а друзья не могут
skew вне форума Ответить с цитированием
Старый 25.12.2012, 13:04   #688
belovchik
Новичок
Джуниор
 
Регистрация: 25.12.2012
Сообщений: 1
По умолчанию

Доброго времени суток! интересует существует ли в исходнике шифрование(если да, то какой тип) сообщений? а если нет, то как можно подобное бы реализовать? заранее спасибо
belovchik вне форума Ответить с цитированием
Старый 29.12.2012, 11:58   #689
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Какую систему защиты можно сделать для данного чата при массовом вылете клиентов? Например, в чате есть 10 человек и я вытаскиваю сетевой кабель из ПК, где находится сервер, после чего вываливается куча ошибок и в конце выходит самая главная ошибка, после чего сервер падает с окном о завершении работы.
Отлов ошибок сокета
Код:
procedure TFormMain.SocketException(Sender: TObject; Error: Exception);
begin
  if (Error.ClassName = 'ESocketError') then
  begin
    UpdateUserMas;
    UpdateUserList;
  end
  else SLError.Add(Format('%s - %s', [FormatDateTime('dd.mm.yyyy hh:mm:ss', Now), Error.Message]));
end;
Изображения
Тип файла: gif 1.gif (8.0 Кб, 159 просмотров)
Тип файла: gif 2.gif (7.8 Кб, 149 просмотров)
Тип файла: gif 5.gif (7.4 Кб, 155 просмотров)
Тип файла: gif 6.gif (6.9 Кб, 158 просмотров)

Последний раз редактировалось Shouldercannon; 29.12.2012 в 13:00.
Shouldercannon вне форума Ответить с цитированием
Старый 29.12.2012, 19:16   #690
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Перехват ошибок приложения в сообщении #69
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17