|
Вопрос # 4 839/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Извините за глупый вопрос... Надо поднять сокетовый сервер, обязательно в консольном ... Я до этого ни разу не работал с консольными приложениями... Добавить сокет сервер и заставить его работать не составило большого труда. А вот как с него отловить события например событие коннекта, и выполнить какой нибудь определенный код... Гуглил долго, и ничего не нашел... Единственное что нагуглил это код ниже, и тот не работает. За раннее огромная благодарность в помощи...
Приложение: Переключить в обычный режим- program Project1;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils, Windows, Forms, ExtCtrls, ScktComp;
-
- var serv : TServerSocket; c: String; myTimer: TTimer;
- count: Integer = 0; label 1;
-
- type
- TServk = class
- class procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
- end;
-
- class procedure TServk.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
- begin
- WriteLn('Connecting complite - '+TimeToStr(NOW));
- c:='Exit';
- end;
-
-
- begin
- try
- serv:=TServerSocket.Create(nil);
- serv.Port:=27010;
- serv.Active:=true;
- serv.OnClientConnect:=TServk.OnClientConnect;
-
- write('Server is Started...');
-
- 1:readln(c);
- if not (c='exit') then
- goto 1 else
- except
- on E: Exception do
- Writeln(E.ClassName, ': ', E.Message);
- end;
- end.
-
 |
Вопрос задал: BloodVIRUS (статус: Посетитель)
Вопрос отправлен: 18 декабря 2010, 23:17
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, BloodVIRUS!
Приведенный Вами код работать не должен:) Потому что он работает только при наличии окна (ему нужна возможность получать сообщения).
Поэтому нужно делать так, как это принято для консольных приложений.
Вариант 1 - с помощью Indy, а именно idTCPServer. сам код можно подсмотреть тут http://www.delphipages.com/forum/showthread.php?t=136612. Пара комментариев к коду. В основной части создается объект idTCPSertver и сразу запускается бесконечный цикл. Сам компонент при этом создает дополнительный поток, в котором слушает входящие подключения. На каждое подключение клиента создается свой поток, обработкой которого занимается IdTCPServer1Execute. Теперь клиенту можно писать/читать данные. Главное, аккуратно с чтением глобальных данных. Ведь если подключится 2 клиента, то будет запущенно две копии этого метода для каждого клиента! и если один поток (а визуально это лишь метод) меняет строку и другой тоже захочет это сделать, то в строке может быть мусор.
Этот метод очень хорош, когда есть немного одновременных клиентов (на 32битных системах без дополнительных настроек больше 2000 одновременных подключений не создать, а на самом деле и того меньше, рельная цифра - 500-800) и с ними ведется активная "переписка".
Вариант 2 - с помощью сокетов, но напрямую. Например тут http://www.realcoding.net/article/view/1833
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 декабря 2010, 00:04
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 20 декабря 2010, 13:52; участников в обсуждении: 1.
|
bugmenot (статус: 3-ий класс), 20 декабря 2010, 13:52 [#1]:
goto! сто лет уже не видел!
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|