Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Консоль и ServerSocket [D7, Win95/98, Win2k]


Aleksey_SV ©   (2003-01-16 17:55:00) 

Я хочу написать сервер на консоли. В обыкновенном приложении всё легко: записал в 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.

Программа нормально запускается, коннектится, но обрабатывать события не хочет. Подскажите что исправить, добавить , или прислать другой пример. Зарание спасибо


aleksey_sv   (2003-01-20 11:33:00) [1]


> Digitman ©

Ну значит я ещё не всё познал в этом деле, но мой вопрос как бы давал понять чего я не знаю. И указать мне,что у меня отсутствует механизм приема Windows-сообщений можно было ещё 3 дня назад.Ну Всё равно спасибо за то ,что вы мне так доходчево объяснили.


Digitman   (2003-01-20 11:04:00) [2]

Так ведь и дискуссиии никто бы не разводил, если бы ты сразу продемонстрировал понимание отличия окна от формы и обычного приложения от консольного)... думаю, даже и вопроса твоего как такового не было бы в этом случае

Создание/разрушение гл.окна приложенит и цикл выборки/диспетчеризации Win32-сообщений в случае "обычного" приложения скрыт в классе TApplication. В случае конс.приложения объект класса TApplication по умолчанию не создается, и ты либо самостоятельно должен выполнить действия по конструированию/инициализации объекта (точно так же как в обычном приложении : Application.Initialize + Application.Run) либо "ручками" проделать многие из тех обязательных действий (характерных для процесса, использующего Win32-окна), которые скрыто проделывает объект TApplication, избавляя таким образом от рутинной работы и полволяя сосредоточиться на лишь прикладной логике обработки событий


aleksey_sv   (2003-01-20 10:45:00) [3]


> Digitman

Вы лучший, всё заработало!!!, так сразу бы!!!, а не разводили бы здесь дискусию, всё оказалось очень просто, Спасибо большое!!


Digitman   (2003-01-20 09:51:00) [4]


> Как этот механизм организовать самостоятельно? Если не секрет
> конечно :)


Да какой там секрет ?)
Обычным образом.

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 09:40:00) [5]


> Digitman

> Этот механизм нужно организовать самостоятельно

Вы читаете мои мысли, это ж я и хочу узнать. Как этот механизм организовать самостоятельно? Если не секрет конечно :)


Digitman   (2003-01-20 08:36:00) [6]


> Консольное приложение принципиально не чем не отличается
> от обычного за исключением первоначального отсутствия формы.


Не формы, а окна !!!!
Это значит, что конс.приложение по умолчанию не имеет механизма приема Windows-сообщений. Этот механизм нужно организовать самостоятельно


> Я решил написать консольное приложение так как форма в этой
> програме ненужна, прога будет висеть в памяти и ловить сообщения
> с клинта и выполнять различные действия оставаясь нивидимой.


А разве "прога" обязательно видима, если она неконсольная ?


Владимир   (2003-01-19 05:11:00) [7]

Aleksey_sv, если я тебя правильно понимаю тебе нужно написать сервер без формы имеющий как можно меньший размер.

Если тебя устроит такой вариант, предлагаю поместить логику сервера в отдельную ДЛЛ.

ЕХЕ можно написать на С++ (например 5), там этот сервер существует и работает точно также.
ДЛЛ вызывай из С++.

ЕХЕ можно написать и на Delhi, но это муторно (хотя я засунул весь сервер в ДЛЛ).

------------------
P.S.

Если ДЛЛ с логикой загружать денамически может получиться неплохой сервак.


Cosmic   (2003-01-18 12:37:00) [8]

Мне и самому интересно. Может, все же кто-нибудь знает, как это сделать? (Лехе привет :)


Alex Konshin   (2003-01-18 09:19:00) [9]

AllocateHWnd из classes.pas и посмотри реализацию TThread


apple   (2003-01-18 08:26:00) [10]

Насколько я понимаю- при создании объекта сокета ты должен задать в параметре конструктора окно, которое будет получать сообщения.Или создать системное событие через WinAPI и всю обработку событий от него вручную.Если знаешь как- это несложно.Но зачем тебе такой гемор?Нет в этом реальной необходимости- если ты не упертый юниксоид и без консоли жить не можешь.


aleksey_sv   (2003-01-17 19:49:00) [11]


> mrcat ©


> Консольное приложение принципиально не чем не отличается
> от обычного за исключением первоначального отсутствия формы

и занимаемого объёма памяти, и места.
...
> Чего ждал? Вы считаете, что он "дождется"?

Мне нужно что бы прога прослушивала порт. Сервер активируется и ждет клиента , и он его ДОЖИДАЕТСЯ (проверено Телнетом и клиентом созданым в нормальном приложении,(у клиента на событие OnCnnect в лист бокс выходит сообщение о коннкте, сервер же остается безмолвным так как у него не произошло события OnClientConnect активизацию которого я и пытаюсь от вас добится))


mrcat   (2003-01-17 19:32:00) [12]

aleksey_sv © (17.01.03 19:10)
...
останавливался и ждал
...


Чего ждал? Вы считаете, что он "дождется"?

...
Консольное приложение принципиально не чем не отличается от обычного за исключением первоначального отсутствия формы
...


???

Не мучайтесь...


aleksey_sv   (2003-01-17 19:10:00) [13]


> mrcat © (17.01.03 18:53)

Ну ладно уговорил, допустил помарку когда набирал.
Допустим там написано так

while (true) do
readln;
serv.Free;
Events.Free;
end.

Или что то тому подобное, короче чтоб процесс останавливался и ждал. Или что вы мне посоветуете по этому поводу, например пример какой нибудь.


mrcat   (2003-01-17 18:53:00) [14]

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 18:43:00) [15]


> Digitman © (17.01.03 08:10)


> Ну так ты представляешь себе, чем принципиально конс.приложение
> отличается от обычного ?

Консольное приложение принципиально не чем не отличается от обычного за исключением первоначального отсутствия формы. Я решил написать консольное приложение так как форма в этой програме ненужна, прога будет висеть в памяти и ловить сообщения с клинта и выполнять различные действия оставаясь нивидимой.


aleksey_sv   (2003-01-17 18:34:00) [16]


> 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; добавляется процедура обработки события


Digitman   (2003-01-17 08:10:00) [17]


> В обыкновенном приложении всё легко
> Совсем по другому в консоли.


Ну так ты представляешь себе, чем принципиально конс.приложение отличается от обычного ?


mrcat   (2003-01-17 00:36:00) [18]

Aleksey_SV © (16.01.03 17:55)
...
но обрабатывать события не хочет....


какие события? Они у вас описаны?


Наверх

Титульная страница Поиск, карта сайта Написать письмо