![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
boobie |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Здравствуйте! Экспериментирую с сетью. Написал программу, отдаленно напоминающую чат: 2 поля ввода (memo1 и memo2), 1 кнопка (button1), TcpServer1, Tcpclient1.
TcpServer1.Localport поставил 7000. Такой же порт поставил в TcpClient1.RemotePort. TcpClient1.Remotehost выставил 127.0.0.1 Код программы:
При создании формы все открываем, при закрытии - рассоединяем, при нажатии на кнопку - отсылаем все строки из memo1 с помощью цикла и tcpclient1.Sendln(memo1.Lines[i]);. Сервер прослушивает, если что-нибудь придет, то эту строку добавляем в memo2. И вот вопросы: 1. Не работает! Приходит только одна строка, только один раз. Потом сообщения не приходят. Каким образом запускается событие TcpServer1Accept? Я думал, что для каждой приходящей строки, отосланной с помощью Sendln, оно генерируется заново. Почему вот так:
работает как надо? 2. В книжках после каждой отправки сообщения авторы разрывают связь, перед отправкой сообщения устанавливают заново. Стоит ли это делать при создании реальных приложений? Т.е. есть ли смысл перед каждой отправкой сообщений коннектится, а потом разрывать связь? |
||||
|
|||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 4 Всего: 133 |
Оно поэтому и Receiveln, что получает только одну строчку (line). Почему-то такие функции как Readln и Writeln подобных вопросов не вызывают...
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
Я помню, в примерах с дельфи поставлялся готовый проект чата.
|
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Akella, да не нужен мне готовый чат, я с сетью разбираюсь
![]() Poseidon, все равно не пойму - отправляется 3 строки, например, а почему метод TcpServer1Accept вызывается всего 1 раз, принимает одну строку (это логично - ReciveLN)... А при последующих нажатиях - ВООБЩЕ ничего не принимает. Почему так? Это сообщение отредактировал(а) boobie - 13.6.2013, 13:11 |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
||||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Ну, Akella, твой 18000-ый пост мог быть и лучше!
![]() Я не случайно привел код, который я взял из работающего примера:
он работает... А я не понимаю почему... Почему так работает, а в "моем" случае - нет. Сам механизм не понятен |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 4 Всего: 133 |
boobie, ты посылаешь в цикле
т.е. выполняешь Sendln несколько раз. Почему ты думаешь, что прочитать это нужно за один Receiveln? -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
ну так трассируй, посмотри что и как выполняется с циклом и без
|
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Т.е. процедура TcpServer1Accept запускается один раз и не выходит из процедуры, пока все данные не будут считаны? Так?
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
А что, F1 выламана?
|
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Эмм... Получается, что данная процедура вызывается сразу после подключения клиента... Создается очередь для хранения клиентских запросов. Эта очередь обслуживается в данной процедуре. Это я понял из справки, бат ай донт спик инглиш. Так? А что происходит с очередью, если ее не обработать в этой процедуре?
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
ничего не происходит, наверное )))
|
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Дело в том, что если не убрать эту очередь из строк, то в следующий раз захода в процедуру не будет...
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
||||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Да, там цикл вставлен... Ничего особенного. Пока есть очередь - получай строку и закидывай в мемо. Проблемы начинаются, если очередь большая и с полученными данными надо что-то делать. Без многопотока тогда не обойтись. Да и поведение TcpServer1Accept неадекватное.
|
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
тебе нужно много текста передавать?
|
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Тогда плюнь на эти недоделанные компоненты. И экспериментируй с библиотекой ICS Она была бы в Дельфи основой для работы с сетью, если бы её автор не отказал бы Борланду. А все примеры для TTCPServer сделаны на основе примера, который поставлялся с ранними версиями Дельфи. И которые только сбивают новичков с толку, заставляя их думать что читать получаемую информацию сервер обязан в событии OnAccept. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Akella, ну... По сети не только текст передают... Не текста, но много.
northener, а Indy? С ней что не так? Да и стандартные TTCPServer\Client настолько плохи? Это сообщение отредактировал(а) boobie - 14.6.2013, 13:40 |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Разработчики Indy изначально пошли не совсем верным путём. Поэтому они до сих пор делают все новые и новые версии, которые плохо совместимы друг с другом. Да и глюков у них судя по сообщениям на разных форумах многовато. А стандартные.. Я не говорил что они плохие. Они просто недоделаны. Такое впечатление что их начали делать и бросили почти в самом начале работы. Их базовый класс TBaseSocket выглядит довольно продуманным. А вот его наследники... -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
northener, хорошо. Но что делать с событием OnAccept в TCPServer? В каком случае оно возникает и как с ним вообще управляться? Что происходит с очередью, если ее не принять в нем? Вообще, есть ли какие-нибудь хорошие книги по работе с сетями в Delphi? Нашел книгу про Инди, но решил пока разобраться со стандартной вкладкой Internet.
|
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
Событие OnAccept, если его правильно воспринимать, возбуждается тогда, когда сервер узнаёт что какой-то новый клиент хочет с ним соединиться. В этом случае сервер должен проверить клиента на его "валидность", оценить свои собственные возможности принять еще одного клиента и с учетом вышесказанного разрешить подключение или отказать в нем. В случае согласия на подключение сервер должен создать новый экземпляр своего "специального клиента", который и будет общаться с вновь подключенным клиентом. Принимать какую-либо информацию, кроме IP адреса клиента и номера физического порта, по которому с ним будет создано соединение в событии OnAccept не есть правильно. Это сообщение отредактировал(а) northener - 14.6.2013, 15:09 -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
А с помощью чего тогда принимать? OnGetThread?
|
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
А вот это (как и многое другое) в классе TTCPServer как раз и не реализовано :( Если хочешь использовать этот класс доделывай его сам. Это сообщение отредактировал(а) northener - 14.6.2013, 14:33 -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Пичалька...
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |