![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с idTCPServer и idTCPClient. [D6, WinXP]
inface © (2004-06-21 12:27:00)Привет всем!
У меня проблема следующая.
Пишу клиент-серверное приложение используя idTCPServer и idTCPClient.
Как отправить данные с сервера выделенному клиенту при нажатии кнопки, я вроде бы разобрался и имеет следующий вид:
procedure TfrmMain.Button1Click(Sender: TObject);
var
Msg: string;
Client: TSimpleClient;
begin
msg:=edit1.Text;
if (Msg <> '') and
(lbClients.ItemIndex <> -1) then
begin
Client := Clients.Items[lbClients.ItemIndex];
TIdPeerThread(Client.Thread).Connection.WriteLn(Msg);
end;
end;
Клиент же в свою очередь ловит эти данные следующим образом.
procedure TForm1.Timer1Timer(Sender: TObject);
var
Com,
Msg,s: string;
begin
if not IdTcpClient1.Connected then
exit;
Msg := IdTCPClient1.ReadLn('', 5);
if Msg <> '' then
if Msg[1] <> '@' then
begin
label2.Caption:=Msg + ' единиц, в ' + timetostr(time);
gametime:=strtoint(msg);
end;
end;
А как сделать так, чтобы на сервере выделить данного клиента и он в свою очередь смог выловить данные от этого клиента?
Если можно опишите что должен делать сервер и что клиент(например через таймер) в этот момент.
alienserg (2004-06-22 01:41:00) [1]inface © (21.06.04 12:27)
Всякий раз, когда клиент шлет серверу строку, на сервере происходит событие OnExecute. Там и лови все, что приходит от клиента. Посмотри Indy ChatDemo.
Кстати имей ввиду, что когда ты по нажатию кнопки делаешь
TIdPeerThread(Client.Thread).Connection.WriteLn(Msg);
то все это дело выполняется в основном VCL потоке, а не в потоке Client.Thread
В случае, если надо инициировать передачу сообщений с сервера по уже открытому connection одновременно с отсылкой сообщений внутри OnExecute, то правильно будет расставлять Critical Sections, чтобы подстраховаться от одновременной отсылки по одному connection из двух разных тредов.