Форум: "Сети";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
ВнизКонсоль и ServerSocket Найти похожие ветки
← →
Aleksey_SV (2003-01-16 17:55) [0]Я хочу написать сервер на консоли. В обыкновенном приложении всё легко: записал в Events и всё. Совсем по другому в консоли. Я поискал на форумах и вот что получил:
program server;
{$APPTYPE CONSOLE}
uses
SysUtils,
scktComp;
type
TEvents=class
procedure Connect(Sender: TObject; Socket: TCustomWinSocket);
end;
procedure TEvents.Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.SendText("hello");
writeln("Client connect");
end;
var Serv:TserverSocket; Events:TEvents;
begin
Events:=Tevents.Create;
serv:=TserverSocket.Create(nil);
serv.OnClientConnect:=events.Connect;
serv.Port:=8000;
serv.Active:=true;
writeln("server started...");
while (true) do
serv.Free;
Events.Free;
end.
Программа нормально запускается, коннектится, но обрабатывать события не хочет. Подскажите что исправить, добавить , или прислать другой пример. Зарание спасибо
← →
mrcat (2003-01-17 00:36) [1]Aleksey_SV © (16.01.03 17:55)
...
но обрабатывать события не хочет....
какие события? Они у вас описаны?
← →
Digitman (2003-01-17 08:10) [2]
> В обыкновенном приложении всё легко
> Совсем по другому в консоли.
Ну так ты представляешь себе, чем принципиально конс.приложение отличается от обычного ?
← →
aleksey_sv (2003-01-17 18:34) [3]
> mrcat © (17.01.03 00:36)
> какие события? Они у вас описаны?
Если я не ошибаюсь то описание события это
type
TEvents=class
procedure Connect(Sender: TObject; Socket: TCustomWinSocket);
end;
procedure TEvents.Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.SendText("hello");
writeln("Client connect");
end;
Для этого создаётся класс Tevents в котором обьявляется событие connect. А в строчке serv.OnClientConnect:=events.Connect; добавляется процедура обработки события
← →
aleksey_sv (2003-01-17 18:43) [4]
> Digitman © (17.01.03 08:10)
> Ну так ты представляешь себе, чем принципиально конс.приложение
> отличается от обычного ?
Консольное приложение принципиально не чем не отличается от обычного за исключением первоначального отсутствия формы. Я решил написать консольное приложение так как форма в этой програме ненужна, прога будет висеть в памяти и ловить сообщения с клинта и выполнять различные действия оставаясь нивидимой.
← →
mrcat (2003-01-17 18:53) [5]aleksey_sv © (17.01.03 18:34)
...
while (true) do
serv.Free;
Events.Free;
end.
...
Как Вы представляете работу этого участка кода?!
Для начала изучите логику работы while(true) do, begin...end;
← →
aleksey_sv (2003-01-17 19:10) [6]
> mrcat © (17.01.03 18:53)
Ну ладно уговорил, допустил помарку когда набирал.
Допустим там написано так
while (true) do
readln;
serv.Free;
Events.Free;
end.
Или что то тому подобное, короче чтоб процесс останавливался и ждал. Или что вы мне посоветуете по этому поводу, например пример какой нибудь.
← →
mrcat (2003-01-17 19:32) [7]aleksey_sv © (17.01.03 19:10)
...
останавливался и ждал
...
Чего ждал? Вы считаете, что он "дождется"?
...
Консольное приложение принципиально не чем не отличается от обычного за исключением первоначального отсутствия формы
...
???
Не мучайтесь...
← →
aleksey_sv (2003-01-17 19:49) [8]
> mrcat ©
> Консольное приложение принципиально не чем не отличается
> от обычного за исключением первоначального отсутствия формы
и занимаемого объёма памяти, и места.
...
> Чего ждал? Вы считаете, что он "дождется"?
Мне нужно что бы прога прослушивала порт. Сервер активируется и ждет клиента , и он его ДОЖИДАЕТСЯ (проверено Телнетом и клиентом созданым в нормальном приложении,(у клиента на событие OnCnnect в лист бокс выходит сообщение о коннкте, сервер же остается безмолвным так как у него не произошло события OnClientConnect активизацию которого я и пытаюсь от вас добится))
← →
apple (2003-01-18 08:26) [9]Насколько я понимаю- при создании объекта сокета ты должен задать в параметре конструктора окно, которое будет получать сообщения.Или создать системное событие через WinAPI и всю обработку событий от него вручную.Если знаешь как- это несложно.Но зачем тебе такой гемор?Нет в этом реальной необходимости- если ты не упертый юниксоид и без консоли жить не можешь.
← →
Alex Konshin (2003-01-18 09:19) [10]AllocateHWnd из classes.pas и посмотри реализацию TThread
← →
Cosmic (2003-01-18 12:37) [11]Мне и самому интересно. Может, все же кто-нибудь знает, как это сделать? (Лехе привет :)
← →
Владимир (2003-01-19 05:11) [12]Aleksey_sv, если я тебя правильно понимаю тебе нужно написать сервер без формы имеющий как можно меньший размер.
Если тебя устроит такой вариант, предлагаю поместить логику сервера в отдельную ДЛЛ.
ЕХЕ можно написать на С++ (например 5), там этот сервер существует и работает точно также.
ДЛЛ вызывай из С++.
ЕХЕ можно написать и на Delhi, но это муторно (хотя я засунул весь сервер в ДЛЛ).
------------------
P.S.
Если ДЛЛ с логикой загружать денамически может получиться неплохой сервак.
← →
Digitman (2003-01-20 08:36) [13]
> Консольное приложение принципиально не чем не отличается
> от обычного за исключением первоначального отсутствия формы.
Не формы, а окна !!!!
Это значит, что конс.приложение по умолчанию не имеет механизма приема Windows-сообщений. Этот механизм нужно организовать самостоятельно
> Я решил написать консольное приложение так как форма в этой
> програме ненужна, прога будет висеть в памяти и ловить сообщения
> с клинта и выполнять различные действия оставаясь нивидимой.
А разве "прога" обязательно видима, если она неконсольная ?
← →
aleksey_sv (2003-01-20 09:40) [14]
> Digitman
> Этот механизм нужно организовать самостоятельно
Вы читаете мои мысли, это ж я и хочу узнать. Как этот механизм организовать самостоятельно? Если не секрет конечно :)
← →
Digitman (2003-01-20 09:51) [15]
> Как этот механизм организовать самостоятельно? Если не секрет
> конечно :)
Да какой там секрет ?)
Обычным образом.
var
hWnd: THandle;
Msg: TMsg;
....
hWnd := CreateWindowEx(...);
While GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
DestroyWindow(hWnd);
← →
aleksey_sv (2003-01-20 10:45) [16]
> Digitman
Вы лучший, всё заработало!!!, так сразу бы!!!, а не разводили бы здесь дискусию, всё оказалось очень просто, Спасибо большое!!
← →
Digitman (2003-01-20 11:04) [17]Так ведь и дискуссиии никто бы не разводил, если бы ты сразу продемонстрировал понимание отличия окна от формы и обычного приложения от консольного)... думаю, даже и вопроса твоего как такового не было бы в этом случае
Создание/разрушение гл.окна приложенит и цикл выборки/диспетчеризации Win32-сообщений в случае "обычного" приложения скрыт в классе TApplication. В случае конс.приложения объект класса TApplication по умолчанию не создается, и ты либо самостоятельно должен выполнить действия по конструированию/инициализации объекта (точно так же как в обычном приложении : Application.Initialize + Application.Run) либо "ручками" проделать многие из тех обязательных действий (характерных для процесса, использующего Win32-окна), которые скрыто проделывает объект TApplication, избавляя таким образом от рутинной работы и полволяя сосредоточиться на лишь прикладной логике обработки событий
← →
aleksey_sv (2003-01-20 11:33) [18]
> Digitman ©
Ну значит я ещё не всё познал в этом деле, но мой вопрос как бы давал понять чего я не знаю. И указать мне,что у меня отсутствует механизм приема Windows-сообщений можно было ещё 3 дня назад.Ну Всё равно спасибо за то ,что вы мне так доходчево объяснили.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c