Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
1-40432
k_len
2003-10-02 07:43
2003.10.13
HTML


8-40529
WMag
2003-06-13 02:14
2003.10.13
Распечатка tif файлов


8-40520
Fenik
2003-05-31 17:40
2003.10.13
Сетка


1-40352
Shuhkoman
2003-10-01 19:17
2003.10.13
Unicode


6-40564
mihail
2003-08-12 22:00
2003.10.13
Кто-нибудь работал с радио-станциями через web ?