Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2013, 14:42   #1
moon-guest
Пользователь
 
Аватар для moon-guest
 
Регистрация: 14.11.2010
Сообщений: 27
По умолчанию Проблемы с ServerSocket в консоли

Решил перевести серверное приложение из оконного в консольный режим и возникла тут же проблема. клиент подключается но события не отрабатывают. их заранее привязал.

dpr - файл
Код:
......
begin
   TServ.Create(7777);
   while true do sleep(1000);
end.
unit TServer - файл

Код:
.......
type
  TServ=class
  private
    ss: TServerSocket;
  public
    constructor Create(cPort: integer);
    destructor Destroy; override;
    procedure OnRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnListen(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnAccept(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnDisconnect(Sender: TObject; Socket: TCustomWinSocket);
  end;

implementation

constructor TServ.Create(cPort: integer);
begin
  ss:= TServerSocket.Create(nil);
  ss.OnAccept:= OnAccept;
  ss.OnClientConnect:= OnConnect;
  ss.OnClientDisconnect := OnDisconnect;
  ss.OnClientRead:= OnRead;
  ss.OnListen:=OnListen;
  ss.Port:=cPort;
  ss.ServerType:=stNonBlocking;
  ss.Open;
end;

procedure TServ.OnRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  socket.SendText(socket.ReceiveText+' - ok');
end;

........
У кого какие идеи есть?

Последний раз редактировалось moon-guest; 20.09.2013 в 05:11.
moon-guest вне форума Ответить с цитированием
Старый 19.09.2013, 20:13   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Процедура - не событие. Событие - TNotifyEvent.
Код:
type
  TServ=class
  private
    ss: TServerSocket;
  public
    constructor Create(cPort: integer);
    destructor Destroy; override;
    procedure FOnRead(Sender: TObject; Socket: TCustomWinSocket);//тут добавил F
    procedure FOnListen(Sender: TObject; Socket: TCustomWinSocket);
    procedure FOnAccept(Sender: TObject; Socket: TCustomWinSocket);
    procedure FOnConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure FOnDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    property OnRead : TNotifyEvent read FOnRead write FOnRead;//та самая строка.
  end;
так, по моему, должно работать.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 20.09.2013, 08:04   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Компоненты дельфишные, такие как серверсокет и клиентсокет, в работе опираются на принятие месаджей винды, и в оконной программе с этим проблем нет, а вот в консольной - есть, она не вполне предназначена для обработки сообщений винды, это надо сделать насильно.
Вот по ссылочке http://forum.pascal.net.ru/index.php?showtopic=24477 поизучайте, там как раз бесконечный цикл приёма-диспатча сообщений сделан.

alextrof94, Вы неправы, в классе-обёртке для серверсокета нет смысла хранить сам носитель ивента, т.к. используются ивенты (носители) из самого серверсокета, а вот подписчики (обработчики/хендлеры для этих ивентов) как раз и должны из некого класса браться (методы с нужными для события сигнатурами методов), что и сделано в обёртке. Возможно, Вы немного запутались (раз уж употребляете оборот речи в котором видно сомнение), лучше освежить теорию, да и при сомнениях лучше сперва проверить на практике, прежде чем советовать.

Последний раз редактировалось phomm; 20.09.2013 в 08:10.
phomm вне форума Ответить с цитированием
Старый 20.09.2013, 08:27   #4
moon-guest
Пользователь
 
Аватар для moon-guest
 
Регистрация: 14.11.2010
Сообщений: 27
По умолчанию

Так не будет работать потому что к событию привязывается процедура которая будет выполняться при отработки данного события. А здесь получается что не отрабатывает данное событие. Может быть это какие-то ограничения для консоли у TServerSocket в Delphi 7?
moon-guest вне форума Ответить с цитированием
Старый 20.09.2013, 08:29   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

stNonBlocking - через оконные сообщения! Где выборка GetMessage? нету!
или выборку крути или
в консоли пользуй ThreadBlocking режим, в событии OnGetThread создаешь поток и в потоке обрабатываешь запрос
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 20.09.2013, 09:22   #6
moon-guest
Пользователь
 
Аватар для moon-guest
 
Регистрация: 14.11.2010
Сообщений: 27
По умолчанию

Обработка в потоке решила все вопросы. Спасибо Всем!
moon-guest вне форума Ответить с цитированием
Старый 23.09.2013, 12:37   #7
moon-guest
Пользователь
 
Аватар для moon-guest
 
Регистрация: 14.11.2010
Сообщений: 27
По умолчанию

После перехода в поток не возможно отследить обрыв канала связи. Перерыл много постов и все как один слизаны с help borland. даже стандартное решение типа:
Код:
...
While (not Terminated) and (ClientSocket.Connected) do 
...
не могут правильно сработать. Поток просто зацикливается при обрыве связи, но подключиться к серверу можно только это будет уже новый поток.

Кто может подсказать как реализовать слежку за целостностью канала связи?
moon-guest вне форума Ответить с цитированием
Старый 23.09.2013, 16:52   #8
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

если Recv вернет 0 - соединение закрыто, если -1 то какой-то трабл и вызывай эксепшен.
Код:
r:=ClientSocket.Recv(...
if r=0 then Break;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ServerSocket stalker1995s Общие вопросы Delphi 3 02.01.2013 13:17
проблемы с отображением рус. яз в консоли. Repac123456 C++ Builder 2 23.02.2011 16:37
ServerSocket MyIE Работа с сетью в Delphi 9 24.06.2010 00:11
Есть ли у IdTCPServer такое свойство как у ServerSocket: ServerSocket.Socket.ActiveConnectio ns? TwiX Работа с сетью в Delphi 3 07.03.2010 14:28
Работа с ClientSocket и ServerSocket из консоли D_E_N Работа с сетью в Delphi 6 28.07.2009 00:27