![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
DelphiTester |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
У меня сервер рассылает по всем клиентам следующим кодом:
Проблема в том, что если подключились подряд 5 клиентов и первый "выпал" (отконнектился), то сообщения проходить не будут и до остальных. Это можно как-нибудь обойти, чтобы вылетев один клиент не вмешивался в работу остальных? |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
клиент отключается как? disconnect или обрыв соединения?
попробуй обработку исключений. -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
DelphiTester |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
Клиент отключается именно обрывом соединения.
А что в этой обработке исключений мне писать? Чего там надо обрабатывать? Не представляю как серверу указать, что клиент случайно вылетел.. |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
После того как система закроет соединение по таймаут, передача данных продолжится.
Думаю в данном случае нужно создавать поток для каждого клиента, и думать над методом синхронизации (если это нужно). Возможно стоит обратить внимание на протокол UDP. -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
DelphiTester |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
На UDP не очень-то "хочется" обращать внимание. Клиентов относительно не много - 5-10. А использовать широковещательные запросы для такого кол-ва, не знаю, имеет ли смысл?
А самостоятельно нельзя ли закрывать соединение с клиентом которые отсоеденился? |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
1. крути цикл в обратную сторону - от кол-ва до 0.
2. Перед отправкой, проверь, активен сокет или нет. |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
насколько я знаю состояние активности не поможет. Snowy, а в чем фокус? а где я писал о широковещательных? просто TCP требует установления соединения, а UDP нет. В UDP обрыва соединения быть не может ![]() -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
Ну мало ли... Может и поможет
![]() Помести SendText в try .. except. По except прибивай коннект. Потому что пока ты крутишь цикл, кол-во соеденений может измениться в меньшую сторону. Тогда поймаешь глюку... Так уж устроены сокеты. Если клиент отвалился, не сообщив об этом, то сервер может не узнать об этом ещё некоторое время. Причём это время может достигать получаса. |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
Тогда глюка бы имела вид обращения к несуществующему объекту. А если клиент ушел по английски то при использовании TCP неизбежно напоришся на тиме оут ![]() Выход один (в моем понимании) на каждого клиента свой поток, если поток начинает тупить то мы его прибиваем. PS: и все таки UDP будет хорошей таблеткой от гимороя ![]() -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
||||
|
||||
Хрипа |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 11.12.2006 Репутация: нет Всего: нет |
Я делал иначи..
Опрашиваю клиентов в сети или нет. И только отсылаю тем что в сети.. проверку Зделай Это сообщение отредактировал(а) Хрипа - 15.5.2007, 17:43 --------------------
<Вырезана, как не соответствующая правилам форума > |
|||
|
||||
DelphiTester |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
Snowy
2. А как проверить активен ли данный клиент? (соединение). Я не нашёл подобных методов у клиента.. Хрипа Данные передаются слишком часто, чтобы перед каждой передачей пытаться делать опрос. drkot Ты имел ввиду "ручную" рассылку циклом через UDP? Вообще UDP у меня ассоциируется с широковещательной рассылкой по сети. |
|||
|
||||
Хрипа |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 11.12.2006 Репутация: нет Всего: нет |
DelphiTester,
100% надо проверять Чел онлайн или нет.. Или использывать события онДисконект и базу данных любую хоть даже текстовую. При дисконекте удалять с базы не верного юзера и при конекте добовлять (при помаши Timer1). И только тем кто в базе отсылать данные. или хранить их всех и менять только режим Онлайн или нет... ну это тучь тяжелей без SQL Это сообщение отредактировал(а) Хрипа - 15.5.2007, 21:38 --------------------
<Вырезана, как не соответствующая правилам форума > |
|||
|
||||
DelphiTester |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 3.5.2007 Репутация: нет Всего: нет |
А как проверить онлайн он или нет??
Насколько я понял при таком "случайном вылете" клиента никаких ошибок не следует и обрабатывать нечего.. Как же узнать, что он отконнектился? Как опрос сделать? (надеюсь не послать ему строку и если он в ответ ответит..... Всё-таки такая технология совсем всю сеть загрузит и правда думать прийдётся о UDP протоколе.) |
|||
|
||||
drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
Класс!!!! Примерно так: подошел к двери, подергал - никого, позвонил - опять никого ![]() Мммм да. Повесилил на ночь глядя. Проверять как, бегать в соседний кабинет и смотреть работает ли прога ? А если по TCP? то сиди и кури тайм оут. DelphiTester, точно также как у тебя сделано, только немного сложнее. тк контроль за соединением (если так можно выразится) обеспечивает программист, а не стек протокола (как в TCP). PS: а вобще читайте документацию или хотябы статейки. -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |