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

Вниз

Консоль и 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
8-29964
Marko_polo
2002-11-28 06:04
2003.03.10
Как создать...


14-30048
Alexanders
2003-02-20 12:02
2003.03.10
Уровень записи


14-30120
Neox
2003-02-23 11:39
2003.03.10
дискета к книге


14-30012
FLAW
2003-02-23 23:12
2003.03.10
Охрана квартиры. Как передать сообщение (wav, mp3) на телефон?


7-30149
sniknik
2003-01-11 23:20
2003.03.10
Внешний СОМ сервер, отследить тип запуска.