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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2014, 08:36   #1
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
Смущение IdTCPServer & IdTCPClient

Привет всем, вообщем у меня наблюдается следующая проблема, подключаются клиенты к моему серверу, и всё нормально, всё работает, только вот после 2-3 а то и больше часов работы вываливается ошибка на клиенте, вообще может кто скажет, клиент подключился к серверу, раз в 1 или 2 минуту будет отзываться что он подключен (что бы в случае обрыва связи у клиента сервер мог его корректно отсоединить), при нормальном отключении клиент сам уведомляет сервер что он уходит, может что то ещё нужно делать? вообще нормально если соединение постоянно открыто?
5cek вне форума Ответить с цитированием
Старый 14.01.2014, 09:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
будет отзываться что он подключен
Нет, если не пропишешь в клиенте постоянный "пинг"
Цитата:
что бы в случае обрыва связи у клиента сервер мог его корректно отсоединить
По идее в случае обрыва Инди само сдисконнектить должно. Т.е. с этим проблем быть не должно, если ты не прописал в дисконнекте какие-то особые действия.
Цитата:
вообще нормально если соединение постоянно открыто?
Нормально. Почему же нет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.01.2014, 09:28   #3
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нет, если не пропишешь в клиенте постоянный "пинг"
Тут не множко не понял про пинг, я обычно делаю отправляю серверу допустим "101" и тот понимает что клиент ещё на связи и не отключает его или есть другой способ?

Цитата:
Сообщение от Stilet Посмотреть сообщение
По идее в случае обрыва Инди само сдисконнектить должно. Т.е. с этим проблем быть не должно, если ты не прописал в дисконнекте какие-то особые действия.
Ну возможно, просто если на клиенте сделать Disconect и не предупредить сервер, то повторно клиент не подключиться, будет already connected а если Disconect'a не было на клиенте, и было допустим обрыв связи, то сервер его сам отключит? Мне кажется не получиться.
Цитата:
Сообщение от Stilet Посмотреть сообщение
Нормально. Почему же нет?
Ну просто читал, говорят нужно делать так: взял подключился отослал команду и отключился, но это ведь потеря скорости если так.
Просто на какие грабли можно наступить при установке постоянно открытого соединения?
5cek вне форума Ответить с цитированием
Старый 14.01.2014, 10:06   #4
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

у меня при долго открытом соединении на клиенте вылетала ошибка connection closed gracefully, по этому и спрашиваю может есть какие то нюансы?
5cek вне форума Ответить с цитированием
Старый 14.01.2014, 10:45   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Тут не множко не понял про пинг, я обычно делаю отправляю серверу допустим "101" и тот понимает что клиент ещё на связи и не отключает его или есть другой способ?
Если это протокол ТСР, то такое действие лишнее. Он все равно на низком уровне будет проверять доставку пакетов и связь.
Цитата:
Мне кажется не получиться.
Когда кажется - пробовать надо.
Создай простейший проект, попробуй подключиться - отключиться и снова подключиться.
Цитата:
взял подключился отослал команду и отключился, но это ведь потеря скорости если так.
Просто на какие грабли можно наступить при установке постоянно открытого соединения?
Вообще это какие-то внутренние "проблемы" самого Инди. по хорошему дисконнект не нужно делать, просто похоже что сам Инди написан так, что только дисконнектом можно сообщить серверу что клиент окончил передачу данных ему. У меня тоже по другому не получалось, я тоже разрывал связь после каждого посыла данных. Возможно я просто не разобрался как в индейке это правильно делать. Когда я работаю с чистыми сокетами такого не происходит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.01.2014, 11:37   #6
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Когда кажется - пробовать надо.
Ну вот же я и пробовал, подключился, отослал текст, сервер его принял ответил, клиент принял ответ. после отключаюсь на клиенте просто делаю Disconect, потом опять пробую подключиться к серверу сервер отвечает Already connections, но если перед отключением сообщаю какой нибудь командой серверу что я отключаюсь, например "exit" и сервер при получении этой команды отключает клиента методом AContext.Connection.Disconect тогда повторное подключение проходит нормально. Именно по этому мне кажется что индейцами это не предусмотрено.
Честно говоря я бы использовал сокеты, но как то пробовал, бывало такое что сообщения не доходят, либо доходят не полностью, либо местами поменялись команды, так и не разобрался я в них по этому перешел на TCP.
5cek вне форума Ответить с цитированием
Старый 14.01.2014, 16:31   #7
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

5cek, загляните в аналогичную тему.

По своему опыту скажу, что Indy не самое лучшее решение для создания сервера (критикую за жирность, объемный код и замеченной нестабильности). В принципе, если одновременных клиентов не превышает порядка 30-50 лиц, то его вполне можно использовать. В ином случае не рекомендуется, так как создается вторичный слушающий поток. Даже не так страшно, что одновременных подключений будет, к примеру, 1000 (того 1000 потоков), и все же слабая машина может не потянуть (в зависимости от задачи). Также можете здесь ознакомиться более детально в самом принципе/алгоритме класса TIdTCPServer.

Лично я как делал: писал на Winsock, главный слушающий сокет (в потоке) у меня был неблокирующим. Он же в свою очередь при подключении клиента создавал клиентский поток, который переводится в блокирующий режим. В плане производительности - замечательно. Разумеется, если одновременно подключится более 10 000 клиентов, то сервер может и помереть, но это все можно предусмотреть на свой вкус и цвет.
Lardes вне форума Ответить с цитированием
Старый 14.01.2014, 18:39   #8
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Эх, да я и рад бы взять сокеты, да не смыслю в них не черта, самое что пугает меня в них то что сообщения могут прийти в разном порядке, а как следить за ними я даже понятия не имею, а клиентов предполагается до 2000, сервер не плохой стоит, на счет него я точно не беспокоюсь)
5cek вне форума Ответить с цитированием
Старый 14.01.2014, 18:41   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А обязательно корявый ТСР брать?
Может попробуешь IdHTTP или IdFTP?
Они понадежнее будут. Я у себя их для тучи клиентов юзаю без проблем.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.01.2014, 19:58   #10
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Stilet, +1 (правда на счет IdHTTP не уверен).

Цитата:
да я и рад бы взять сокеты, да не смыслю ...
Так учитесь, кто мешает?) Берите мою основу, остальное что добавить в код есть в постах. Ради интереса почитайте это, а для пущего всезнания советую вот это. Поймете общую концепцию работы серверов.

Цитата:
что пугает меня в них то что сообщения могут прийти в разном порядке
Это не должно быть для Вас проблемой, а должно быть вопросом как это решить. Если выбираете TCP, то в плане получения данных он надежнее, чем UDP (даже не факт, что пакеты могут прийти), и собирайте данные в буфер.

Последний раз редактировалось Lardes; 14.01.2014 в 20:02.
Lardes вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IdTCPServer и IdTCPClient -=<_Makap_>=- C++ Builder 0 08.12.2012 18:41
Работа с IdTCPServer и IdTCPClient rule-z Работа с сетью в Delphi 4 19.08.2011 07:58
События в idTCPServer и idTCPClient (Delphi) _PROGRAMM_ Помощь студентам 3 11.11.2010 19:35
IdTcpClient и idTcpServer xTANATOSx Работа с сетью в Delphi 9 17.05.2008 23:11
передача файла от idtcpclient к idtcpserver SeЯgey Работа с сетью в Delphi 1 13.05.2008 11:21