Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 839

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Извините за глупый вопрос... Надо поднять сокетовый сервер, обязательно в консольном ... Я до этого ни разу не работал с консольными приложениями... Добавить сокет сервер и заставить его работать не составило большого труда. А вот как с него отловить события например событие коннекта, и выполнить какой нибудь определенный код... Гуглил долго, и ничего не нашел... Единственное что нагуглил это код ниже, и тот не работает. За раннее огромная благодарность в помощи...

Приложение:
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils, Windows, Forms, ExtCtrls, ScktComp;
  7.  
  8. var serv : TServerSocket; c: String; myTimer: TTimer;
  9. count: Integer = 0; label 1;
  10.  
  11. type
  12. TServk = class
  13. class procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
  14. end;
  15.  
  16. class procedure TServk.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
  17. begin
  18. WriteLn('Connecting complite - '+TimeToStr(NOW));
  19. c:='Exit';
  20. end;
  21.  
  22.  
  23. begin
  24. try
  25. serv:=TServerSocket.Create(nil);
  26. serv.Port:=27010;
  27. serv.Active:=true;
  28. serv.OnClientConnect:=TServk.OnClientConnect;
  29.  
  30. write('Server is Started...');
  31.  
  32. 1:readln(c);
  33. if not (c='exit') then
  34. goto 1 else
  35. except
  36. on E: Exception do
  37. Writeln(E.ClassName, ': ', E.Message);
  38. end;
  39. end.
  40.  


BloodVIRUS Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

bugmenot (статус: 3-ий класс), 20 декабря 2010, 13:52 [#1]:

goto! сто лет уже не видел!
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.