Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Вниз

Как присвоить новій обработчик события   Найти похожие ветки 

 
KyRo   (2006-05-04 14:06) [0]

Подскажите.
Я объявляю переменную
Server:TServerSocket;

после чего в коде создаю этот компонент

Server:=TServerSocket.Create(nil);
Server.Port:=9990;
Server.Active:=True;


И я хочу что бы при возникновении события оно происходило в моей процедуре , а не в стандартной .

Я делал так
Server.Socket.OnClientRead:=Connect

Но на в таком случае оно выдает ошибку .

Как можно еще это сделать или обязательно надо создавать потомка ?


 
MBo ©   (2006-05-04 14:08) [1]

обработчик события должен быть не обычной процедурой, а методом объекта (например, формы, если она есть)


 
KyRo   (2006-05-04 14:10) [2]

А если я например в нити создам новый метод и его присвою ?


 
MBo ©   (2006-05-04 14:21) [3]

Да, можно, лишь бы прототип совпадал.


 
KyRo   (2006-05-05 13:02) [4]

Я сделал так
Server:=TServerSocket.Create(nil);
 Server.Port:=9990;
 Server.Socket.OnClientRead:=ClientRead;
 Server.Socket.OnClientWrite:=ClientWrite;
 Server.ServerType:=stTHreadBlocking;
 Server.ThreadCacheSize:=10;
 Server.Active:=True;

где
ClientRead; и ClientWrite; - это

Procedure TServerHr.ClientRead(Sender: TObject;Socket: TCustomWinSocket);
  var
 s:String;
begin
 s:=Socket.ReceiveText;
 end;

объявленые в

TServerHr = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 public
   constructor Create(CreateSuspennded: Boolean);
   procedure   ClientRead(Sender: TObject;Socket: TCustomWinSocket);
   Procedure   ClientWrite(Sender: TObject;Socket: TCustomWinSocket);
 end;


Но когда я начинаю работать с сокетами то эти события не возникают из за чего это может быть ?


 
Сергей М. ©   (2006-05-05 13:05) [5]


> из за чего это может быть ?


Из-за того что "работать с сокетами" - это на деревню дедушке


 
KyRo   (2006-05-05 13:08) [6]


> Сергей М. ©   (05.05.06 13:05) [5]
>
> > из за чего это может быть ?
>
>
> Из-за того что "работать с сокетами" - это на деревню дедушке

????
что ты имееш ввиду ?
Я посылаю тест от клиента к серверу и пытаюсь его принять и потом наоборот .
И клиент и сервер у меня блокирующие.


 
Сергей М. ©   (2006-05-05 13:18) [7]


> KyRo   (05.05.06 13:08) [6]


> ????


!!!!


> что ты имееш ввиду ?


То что "работать с сокетами" вполне может означать и, например, забивание сокетами гвоздей.
А ты что имел ввиду под "работать с сокетами" ?

Может тупить наконец перестанешь и таки приведешь реальный свой код ?


 
KyRo   (2006-05-05 13:25) [8]


Server:=TServerSocket.Create(nil);
Server.Port:=9990;
Server.Socket.OnClientRead:=ClientRead;
Server.Socket.OnClientWrite:=ClientWrite;
Server.ServerType:=stTHreadBlocking;
Server.ThreadCacheSize:=10;
Server.Active:=True;

Вот создал сервер
Client:=TClientSocket.Create(nil);
   Client.Port:=9990;
   Client.HOST:="localhost";
   Client.OnRead:=ClientRead;
   Client.OnWrite:=ClientWrite;
   Client.ClientType:=ctBlocking;
   Client.Active:=True;
   Client.Socket.SendText("YES");


Таким образом создал клиент  и послал сообщение

Procedure TServerHr.ClientRead(Sender: TObject;Socket: TCustomWinSocket);
  var
 s:String;
begin
 s:=Socket.ReceiveText;
 end;


Пытаюсь принять сообщение от клиента

 While not Terminated do
     begin
     if Server.Socket.ActiveConnections>0
       then
         begin
          for i := 0 to Server.Socket.ActiveConnections -1  do
            begin
             Server.Socket.Connections[i].SendText("Hello");
            end;
        end;

А таким образом пытаюсь с сервера отправить собщение клиенту.
Клиент принимает сообщение так же само как и сервер.
Так вот эти события OnRead у клиента  OnClientRead у сервера и у клиента не возникают.
Это может быть из за блокирующего режима ? И вообще из за чего они не возникают . Может их нельзя делать методом нити ?


 
Сергей М. ©   (2006-05-05 13:51) [9]


> Пытаюсь принять сообщение от клиента


Ок конкретного клиента, надо понимать ?

И где же, в какой конкретной строчке ты конкретно принимаешь конкретные данные от конкретного клиента ?

Где у тебя на стороне сервера фигурирует конкретный клиент ? Сам-то себе ты в состоянии вразумительно растолковать это ?


 
KyRo   (2006-05-05 13:58) [10]


> Где у тебя на стороне сервера фигурирует конкретный клиент
> ?


Procedure TServerHr.ClientRead(Sender: TObject;Socket: TCustomWinSocket);
 var
s:String;
begin
s:=Socket.ReceiveText;
end;


Вот принимаю я это сообщение которое послал клиент !! Или это не то ?


 
Сергей М. ©   (2006-05-05 14:03) [11]


> это не то ?


Это - "то"... но при условии что событие это возникает.

Но ты сказал что сервер у тебя  - stThreadBlocking.

Где обработка события GetThread ?
Где реализация метода ClientExecute ?


 
KyRo   (2006-05-05 14:03) [12]

Когда возникает это событие как я понял меняется
Socket: TCustomWinSocket он и определяет уникальность клиента.
Или я не прав ?


 
KyRo   (2006-05-05 14:06) [13]


> Где обработка события GetThread ?
> Где реализация метода ClientExecute ?

Я про такие и не знал !!!
А можно по подробнее что в них надо делать , а то в литературе что я располагаю про не чего про них не написано !!


 
Сергей М. ©   (2006-05-05 14:13) [14]


> KyRo   (05.05.06 14:03) [12]


Прав.


> Я про такие и не знал !!!


Ну разумеется ... Только избранные могут прочитать всем доступную справку к методам-свойствам компонента ..


> можно по подробнее что в них надо делать


В обработчике OnGetThread() ты должен создать экз-р класса-наследника TServerClientThread, в котором ты волен перекрыть виртуальный метод ClientExecute(), в котором ты волен делать с гнездом все что угодно, вплоть до забивания им гвоздей.


 
KyRo   (2006-05-05 14:23) [15]

ок пошол читать справку !


 
Сергей М. ©   (2006-05-05 14:26) [16]


> пошол читать справку


book.itep.ru тебе в помощь (раздел - "Winsock")


 
KyRo   (2006-05-05 16:44) [17]

Все перыл , а так и не нашол не чего толкового.
Решил пробовать своими силами  
И так.

Я создал клас
TClientThread = class(TServerClientThread)
   private
   protected
    procedure ClientExecute; virtual;
   public
   end;


В событии я создаю экземпляр этого класса

Procedure TServerHr.GetThread(Sender: TObject;  ClientSocket: TServerClientWinSocket;
                  var SocketThread: TServerClientThread);
 begin
   ClientThread:=TClientThread.Create(True,ClientSocket);
 end;

А что мне делать в


procedure TClientThread.ClientExecute;
begin

end;

Как мне можно  получить сообщение ?


 
Сергей М. ©   (2006-05-05 16:48) [18]


> создал клас
> TClientThread = class(TServerClientThread)
>    private
>    protected
>     procedure ClientExecute; virtual;


Почему virtual ?


 
KyRo   (2006-05-05 16:59) [19]

Ну он в исходниках виртуал я его таким и создал , если не надо то уберу.

Я не могу понять что делать дальше ?
ClientSocket.Read(1); вызывать эту процедуру ?


 
KyRo   (2006-05-05 18:19) [20]

Я сделал вот так но что то не чего не приходит от клиента

procedure TClientThread.ClientExecute;
var
 s:string;
begin
 s:= ClientSocket.ReceiveText;

end;


 
KyRo   (2006-05-05 18:26) [21]

Все текст серверу клиент вроде передает  , а как передать теперь сообщение клиенту там тоже не работают события  Onread и нет события
GetThread как на сервере ?


 
Сергей М. ©   (2006-05-06 09:40) [22]


> он в исходниках виртуал я его таким и создал


TClientThread = class(TServerClientThread)
  private
  protected
   procedure ClientExecute; override; //!!
  public
  end;

Ведь есть же пример в справке по реализации метода ClientExecute, почему бы не изучить его ?


> там тоже не работают события  Onread


В блокирующем режиме действительно не работают (за полной ненадобностью).

В неблокирующем же замечательно работают, если в потоке, выполнившем ClientSocket.Open работает цикл ожидания/выборки/диспетчеризации оконных сообщений.


> нет события
> GetThread как на сервере


Конечно нет. За полной ненадобностью.


 
KyRo   (2006-05-06 10:47) [23]

I>
> TClientThread = class(TServerClientThread)
>   private
>   protected
>    procedure ClientExecute; override; //!!
>   public
>   end;
>
> Ведь есть же пример в справке по реализации метода ClientExecute,
>  почему бы не изучить его ?


Я перекрыл еще процедуру  procedure Execute;  и сделал ее
override , а ClientExecute оставил обычной.
Вроде как работает покрайней мере текст передает , хотя мне надо файл но это потом.

А в каком тогда событии клиента получать данные от сервера ?


 
Сергей М. ©   (2006-05-06 11:05) [24]


> перекрыл еще процедуру  procedure Execute;  и сделал ее
> override , а ClientExecute оставил обычной.


Зачем ты Execute перекрыл ?!
Не следует этого делать.
Для реализации собственной транспортной логики тебе предоставлен ClientExecute, вот его и перекрывай как тебе будет угодно. А Execute не трогай - там реализована спец.логика.


 
Сергей М. ©   (2006-05-06 11:06) [25]


> в каком тогда событии клиента получать данные от сервера
> ?


Как это в каком ?
В OnRead !


 
KyRo   (2006-05-06 11:52) [26]


> Сергей М. ©   (06.05.06 11:06) [25]
>
> > в каком тогда событии клиента получать данные от сервера
>
> > ?
>
>
> Как это в каком ?
> В OnRead !
> <Цитата>


OnRead  у меня не работает !! У меня клиент тоже в блокирующем режиме работает .Я пробовал ему послать текст не чего не происходит.


 
KyRo   (2006-05-06 11:58) [27]


> Зачем ты Execute перекрыл ?!
> Не следует этого делать.
> Для реализации собственной транспортной логики тебе предоставлен
> ClientExecute, вот его и перекрывай как тебе будет угодно.
>  А Execute не трогай - там реализована спец.логика


Это исправил сервер сообщения принисает. Спасибо.
А вот так я посылаю сообщения клиенту. Еще пробовал посылать из
ClientExecute и что то не чего на клиенте не происходит.


While not Terminated do
    begin
     if Server.Socket.ActiveConnections>0
       then
         begin
           for i := 0 to Server.Socket.ActiveConnections -1  do
             begin
               Server.Socket.Connections[i].SendText("Hello");
             end;
         end;
  end;


 
Сергей М. ©   (2006-05-06 13:17) [28]


> клиент тоже в блокирующем режиме работает


Раз в блокирующем, значит вызов receive-метода можно разместить в любом месте в любое время после того как клиент установил соединение.


 
KyRo   (2006-05-06 14:09) [29]


> > клиент тоже в блокирующем режиме работает
>
>
> Раз в блокирующем, значит вызов receive-метода можно разместить
> в любом месте в любое время после того как клиент установил
> соединение.

Не знаю значит наверно не везде
Я так создаю клиента

Client:=TClientSocket.Create(nil);
   Client.Port:=9990;
   Client.HOST:="localhost";
   Client.OnRead:=ClientRead;
   Client.OnWrite:=ClientWrite;
   Client.ClientType:=ctBlocking;
   Client.Active:=True;


А вот так я пітаюсь принять сообщение

Procedure TNetwork_ClientHR.ClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
 s:String;
begin
 s:=Socket.ReceiveText;
 ShowMessage(s);
end;


И не чего не происходит. Или попробовать его вызвать не в событии а просто после создание а активизации клиента ?


 
KyRo   (2006-05-06 14:15) [30]


> Сергей М.

Да не в событии принимает значения.
Спосибо вроде немного в принципах разобрался .
Хотя скорее всего вопросы у меняеще будут.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.013 c
15-1145965134
mctarik
2006-04-25 15:38
2006.05.21
Опрос!!! Кодинг или Копирование чюжих исходников


2-1146811234
RomanH
2006-05-05 10:40
2006.05.21
Управление DBLookUpComboBox ом


1-1144733950
tigra
2006-04-11 09:39
2006.05.21
Ширина колонок таблицы в Word


2-1145989229
непонимающий
2006-04-25 22:20
2006.05.21
сохранение в файл


15-1145902347
Grando_Lamer
2006-04-24 22:12
2006.05.21
Портирование на мобильники





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский