| 
| 
 | Вопрос # 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);beginWriteLn('Connecting complite - '+TimeToStr(NOW));c:='Exit';end;  begin  tryserv:=TServerSocket.Create(nil);serv.Port:=27010;serv.Active:=true;serv.OnClientConnect:=TServk.OnClientConnect; write('Server is Started...'); 1:readln(c);if not (c='exit') thengoto 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сця, де призупинилося.
 
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |