Форум: "Сети";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
ВнизTIDTelnetServer Найти похожие ветки
← →
alt7 (2003-08-13 11:35) [0]Добрый день всезнающий народ...
Не подскажите, как сделать, чтоб сабж откликался на команды (а то я сходу не нашел)
То есть, я к примеру пишу ему LAST (в клиенте), а он мне передает последние данные?
← →
Reindeer Moss Eater (2003-08-13 12:01) [1]Напиши реализацию команд и это будет.
← →
alt7 (2003-08-13 12:12) [2]procedure IdTelnetSrvConnect(AThread: TIdPeerThread);
procedure IdTelnetSrvDisconnect(AThread: TIdPeerThread);
procedure IdTelnetSrvException(AThread: TIdPeerThread; AException: Exception);
procedure IdTelnetSrvExecute(AThread: TIdPeerThread);
procedure IdTelnetSrvAuthentication(AThread: TIdPeerThread;
const AUsername, APassword: String; var AAuthenticated: Boolean);
Вот такие процедуры есть у меня.
В последних двух я отсылаю данные клиенту. Штука в том, что клиент подключается и постоянно получает данные, то есть НИКАКИХ СТРОК он серверу не отсылает (имя и пароль не считаются)...
а теперь надо, чтоб клиент мог отправить команду LAST. В какой обработчик события надо поставить обработку эту.. и примерно как сделать-то?
← →
Reindeer Moss Eater (2003-08-13 12:15) [3]Если есть CommandHandlers, то их OnCommand + OnNoCommandHandler;
Если нет, то OnExecute
← →
alt7 (2003-08-13 15:10) [4]Гм, странная ситуевина получается: если я нажму ченить от клиента, тогда строки идут с сервера, иначе нет, то есть обработка застряет на первом куске... можно это как-то обойти?
Первый кусок:
if AThread.Connection.CurrentReadBuffer <> "" then
begin
gl_frcl := gl_frcl + AThread.Connection.CurrentReadBuffer;
if pos("ATAT",gl_frcl) <> 0 then
begin
Writeln("LAST granted");
gl_frcl := "";
AThread.Connection.InputBuffer.Clear;
with AThread.Connection do
begin
WriteLn("LT"+" "+arrS_last2[1]);
WriteLn("LT"+" "+arrS_last2[2]);
WriteLn("LT"+" "+arrS_last2[3]);
WriteLn("LT"+" "+arrS_last2[4]);
WriteLn("LT"+" "+arrS_last2[5]);
WriteLn("LT"+" "+arrS_last2[6]);
WriteLn("LT"+" "+arrS_last2[7]);
WriteLn("LT"+" "+arrS_last2[8]);
end;
end;
end;
Второй кусок, отправление ДРУГИХ данных клиенту <skipped>
← →
Reindeer Moss Eater (2003-08-13 15:18) [5]begin
cCommand:=AThread.Connection.ReadLn;
end;
← →
alt7 (2003-08-13 15:23) [6]и что? по умолчанию стоит время infinite, и из этой строки уже не выходит... я ставил 1сек., но почему-то все равно не выходит
← →
Reindeer Moss Eater (2003-08-13 15:41) [7]При чем здесь таймаут?
и из этой строки уже не выходит
А клиент что-нибудь вводит и завершает это оганичителем?
← →
alt7 (2003-08-13 15:48) [8]клиент же не постоянно вводить что-то должен...
то есть, если в буфере ничего нет, то этот кусок не должен обрабатываться...
а если ввел то смотрим что ввел, если правильно то высылка данных
в нажатием ENTER клиента чето пока непонятно тоже. как отловить что юзер enter нажал?
← →
Reindeer Moss Eater (2003-08-13 15:53) [9]клиент же не постоянно вводить что-то должен...
Согласен.
А зачем при этом возвращаться из AThread.Connection.ReadLn?
Можешь объяснить?
← →
alt7 (2003-08-13 15:58) [10]дык возращаться надо чтобы отправить клиенту текущую порцию инфо... а иначе ж ему ничего не отправляется...
инфа:
8 полей - 8 значений.. необязательно всем приходить вместе, меняются по времени
LAST: передать последние значения по этим 8 полям
← →
Reindeer Moss Eater (2003-08-13 15:59) [11]дык возращаться надо чтобы отправить клиенту текущую порцию инфо... а иначе ж ему ничего не отправляется...
Клиент еще ничего не ввел. Что ты ему собрался отправлять???
← →
alt7 (2003-08-13 16:07) [12]так ему не надо ничего вводить.. он подключился и данные ему посыпались.. (я где-то выше писал)
а мне теперь надо чтоб клиент мог посмотреть последние данные по 8 полям сразу
← →
Reindeer Moss Eater (2003-08-13 16:19) [13]Ну так и отправь данные.
Не проверяя никаких буферов.
После чего читай его команду.
← →
alt7 (2003-08-13 16:25) [14]так во-первых не известно, когда клиенту в голову взбредет написать LAST.
Во-вторых, как только данные обработаны сервером их нуно отправить клиенту.
В-третьих, как написать обработку сообщения от юзера, таким макаром, чтоб если в данный момент от него ничего не пришло, то идти дальше по коду? (без всяких пауз, время критично)
← →
Reindeer Moss Eater (2003-08-13 16:29) [15]так во-первых не известно, когда клиенту в голову взбредет написать LAST.
Стоп! Ты хотел отправить данные не дожидаясь ввода.
← →
alt7 (2003-08-13 16:40) [16]брррр....
смотри... сервер принимает постоянно данные с другого сервера... потом их обрабатывает и получает значения для полей... эти значения, как только обработаны передаются клиенту... и неважно, что за 5 секунд пришли данные скажем по 3м полям, а по 5ти другим нет...
Вот клиент подключается (имя, пароль) и тут ему на голову постоянно сыпятся значения полей...
к примеру пришло:
номера полей:
1) 2
2) 3
3) ничего не было еще
4) 5, потом пришло 4, потом 6
5) ничего
6) 3, 2, 7, 8
7) 2
8) ничего
клиент вводит LAST и я ему должен передать:
2,3,пусто,6,пусто,8,2,пусто
Отправил это и передаю опять свежепоступающие данные (которые пришли позже)
← →
Reindeer Moss Eater (2003-08-13 16:46) [17]брррр...
1.
Вот клиент подключается (имя, пароль) и тут ему на голову постоянно сыпятся значения полей...
И как он (клиент) при этом сможет вводить свои данные?
2.
Ты уверен, что это задача Telnet сервера?
← →
alt7 (2003-08-13 16:51) [18]1. не знаю, у меня вводит (вот только с enter проблемка)
2. может и нет, но прога уже написана именно на нем (с TIDTCP были проблемы в свое время их так и не устранили.. я много на форумах спрашивал).. а теперь пара доделок надо.. (2 команды от клиента)
← →
Reindeer Moss Eater (2003-08-13 17:18) [19]Трудно тебе помочь.
Протокол взаимодействия клиента и сервера туманен.
В качестве сервера зачем-то выбран TidTelnet.
Телнет клиент, позволяющий вводить пользователю данные во время вывода непрерывного потока данных с сервера, но не позволяющий нажать Enter......
Все это загадочно.
← →
alt7 (2003-08-13 17:31) [20]Не могу сказать, что туманен, я думаю - я нормально объяснил...
вероятно enter срабатывает, просто я не знаю как его отловить в буфере, как он там обозначен?
А что посоветуешь брать в качестве сервера? из инди и не TCPServer?
← →
Reindeer Moss Eater (2003-08-13 17:35) [21]вероятно enter срабатывает, просто я не знаю как его отловить в буфере, как он там обозначен?
Его ловить не надо. Если он является ограничителем строки для ReadLn, то сразу после возврата из ReadLn (если нет таймаута) - ты поймал команду клиента ограниченную этим самым ограничителем.
← →
nikkie (2003-08-13 18:10) [22]>alt7
забудь про конкретные компоненты и события. продумай сначала протокол. а то каша получается - сервер сыпет данные, и вдруг посередине этих данных получает комманду от клиента, приостанавливает свое дело, кидает ответ на комманду и начинает сыпать дальше? интересно, какой клиент в этом сможет разобраться. клиента-то ты сам пишешь или telnet пользуешься?
← →
alt7 (2003-08-14 12:27) [23]клиента пока нету, но буду потом писать, счас телнет...
сервер то тоже мой... я просто в начале каждой строки от сервера клиенту вставляю опред. комб. букв, и по ним потом будет клиент смотреть...
то есть для меня протокол прозрачен.. вот как бы сделать, то что я здесь писал...
← →
nikkie (2003-08-14 13:14) [24]>клиента пока нету, но буду потом писать, счас телнет...
вот тогда ты и задумаешься - зачем же ты сделал telnet сервер
делай readln с маленьким таймаутом.
← →
alt7 (2003-08-14 16:10) [25]а про это я уже писал, таймаут проходит, а readln не заканчивается
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c