Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.21;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.042 c
15-1146034195
veter
2006-04-26 10:49
2006.05.21
Диплом


6-1138181074
MetalFan
2006-01-25 12:24
2006.05.21
работа с idHTTP


15-1146160110
dyd
2006-04-27 21:48
2006.05.21
как заблокировать USB


2-1146841458
stayer
2006-05-05 19:04
2006.05.21
Excel


2-1146417893
tickler
2006-04-30 21:24
2006.05.21
точное отслеживание времени