Форум: "Начинающим";
Текущий архив: 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