![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить сообщение от TCPServera? [D7, WinXP]
Anton. © (2004-06-09 16:06:00)Проблема такая отправляю сообщение на сервер
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
IdTCPClient1.WriteLn(‘М'+Memo2.Text);
end;
на сервере обработчик
if Msg[1]='M' then
begin
BroadcastMessage('E', 'New Message');
End;
Как клиенту получить это сообщение, делать ReadLn по таймеру?
Anton. (2004-06-10 10:54:00) [21]хорошо вот такой код отправит сообщения все подключенным на данный момент клиентам?
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
Msg : string;
Count: Integer;
begin
Msg := AThread.Connection.ReadLn;
for Count := 0 to IdTCPServer1.Threads.LockList.Count -1 do
TIdPeerThread(IdTCPServer1.Threads.LockList.Items[Count]).Connection.WriteLn(Msg);
IdTCPServer1.Threads.UnlockList;
Digitman (2004-06-10 10:15:00) [22]
> Anton. (10.06.04 09:49) [9]
объект TIdTCPServer имеет св-во Threads: TThreadList, это список объектов класса TIdPeerThread, каждый из которых ассоциирован с активным клиентом
объект TIdPeerThread имеет св-во Connection: TIdTCPServerConnection
объект Connection имеет метод WriteLn()
Reindeer Moss Eater (2004-06-10 09:55:00) [23]При чем здесь таймер?
Зачем он?
А про то, что надо сделать что бы все клиенты получили сообщение первого клиента тебе уже сказали.
Artem03 (2004-06-10 09:54:00) [24]Я у себя реализовал это по таймеру, т.е. после посылки сообщения на сервер (IdTCPServer) мой клиент ждет 1,5 секунды (как сказала одна барышня: "Шоб на верняка"), а затем принимает информацию от сервера.
Касательно сервера. У него есть событие
OnExecute(AThread: TIdPeerThread), где AThread ОДНОЗНАЧНО ИДЕНТИФИЦИРУЕТ источник получения информации (IdTCPClient'а, короче). А потому, вешаешь на это событие нужный тебе код и вперед.
А у параметра AThread есть куча всяких свойств, Например - Connection (соединение, ВЫЗВАВШЕЕ метод OnExecute).
У него есть методы Write...(написать клиенту) и Read...(прочитать от клиента). Так что успехов.
Anton. (2004-06-10 09:49:00) [25]нет вопрос в другом как осуществить широковешательное сообщение, то есть например один клиент послал серверу сообщение, и об этом сразу же должны знать все клиенты подсоедененные к серверу. Делать это по таймеру опрашивать всем сервер, или ставить TCP клиент и TCP сервер на одно приложение?
Reindeer Moss Eater (2004-06-10 09:33:00) [26]Если отвечающий ответит на вопрос спрашивающего, то спрашивающий будет знать ответ только услышав отвечающего.
Так? Или может иначе?
Anton. (2004-06-10 08:50:00) [27]Чесно смотрел, но если клиент отправит серверу сообщение WriteLn, то клиент его получит только опросив сервер, так?
Digitman (2004-06-10 08:20:00) [28]
> Что то я нигде таких примеров не нахожу
ну разумеется ... а набрать в справке по Инди-компонентам, например, ключ.слово "WriteLn" да посмотреть, какие Инди-классы имеют этот метод - не царское это дело ..
Anton. (2004-06-09 18:04:00) [29]Как можно отправить сообщение от сервера к клиенту? Что то я нигде таких примеров не нахожу
Digitman (2004-06-09 17:31:00) [30]
> а если клиентов 2
да хоть 2 миллиона !
> второй получает сообщение, только послав запрос серверу
это в отношении [1] ? не нужно интерпретировать ПРИМЕР столь буквально ...
Reindeer Moss Eater (2004-06-09 17:25:00) [31]Клиент посылает сообщение серверу, а не другим клиентам.
Что бы другие клиенты увидели сообщение нужно чтобы серверотправил это сообщение этим клиентам
Anton. (2004-06-09 17:12:00) [32]а если клиентов 2, то второй получает сообщение, только послав запрос серверу. как сделать что бы он автоматом принял? т.е один послал, на всех остальных клиентах отразилось?
Reindeer Moss Eater (2004-06-09 16:32:00) [33]procedure TForm1.BitBtn1Click(Sender: TObject);
var Response : string;
begin
IdTCPClient1.WriteLn(‘М'+Memo2.Text);
Response:=IdTCPClient1.ReadLn;
end;