Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.62 MB
Время: 0.056 c
14-30074
shusha
2003-02-21 17:21
2003.03.10
Алгоритм


6-29978
Николай Быков
2003-01-10 03:10
2003.03.10
Browser.ExecWB();


3-29705
Ihtiandr
2003-02-18 17:28
2003.03.10
Generator


4-30194
Nikolas van rain
2003-01-19 19:54
2003.03.10
Имитация мышки в IE через программу либо в WeBBrowser-e


14-30037
wnew
2003-02-24 15:50
2003.03.10
PC + NoteBook





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский