![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сервер. отправка всем клиентам [D7, WinXP]
lena19 © (2004-04-05 08:51:00)Всем привет
Народ подскажите как отправить
С компонента serversocket данные всем клиентам ?
Digitman (2004-04-18 11:49:00) [1]
> почему не просто length(Msg) ?
потому что автор никак не оговорил свой фактический ПИО
в этих условиях единственным способом разграничивать строковые сообщения в потоке принимаемых есть способ сканирования вх.потока на предмет обнаружения терминирующего нуля, отправляемого передающей стороной как символ конца строки
SergP (2004-04-18 11:06:00) [2]>Adil (17.04.04 22:31)
ИМХО не пройдет. При отконективании или приконективании нового клиента номера подключений могут поменяться. Поэтому кто-то из клиентов может получить 2 раза одно и то-же, а кто-то нифига...
Хотя вообще-то хз.
Adil (2004-04-17 22:31:00) [3]Можно делать так:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
inc(x);
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
dec(x);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=0 to x-1 do
ServerSocket1.Socket.Connections[i].SendText('Salam')
end;
Это самый примитивный вариант.
Piter (2004-04-17 14:35:00) [4]MasterDenis (15.04.04 22:19) [6]
А если в момент перебора от 0 до X одно из соединений закрылось? Исключение обрабатывать?
Можно использоватьfor ... downto
Хотя тоже есть свои проблемы...
Digitman (16.04.04 10:25) [8]
Length(msg) + 1
А почему не просто length(Msg) ?
Digitman (2004-04-16 13:39:00) [5]бывает) ... тяпница ж сегодня !)
Rouse_ (2004-04-16 13:32:00) [6]Да действительно, что-то уже к концу недели мозги кипят :)
Digitman (2004-04-16 11:34:00) [7]
> Rouse
по сути, использование здесь стрим-объекта и метода SendStream позволяет оч просто организовать индивидуальную для каждого клиента буферизацию передаваемых ему в неблок.режиме данных и легко избежать геморроя с необходимостью явной обработки OnClientWrite - в случае со стрим-передачей компонент сам обработает все FD_WRITE-события, передавая стрим кусок за куском, пока весь стрим не будет передан
Digitman (2004-04-16 11:29:00) [8]
> Rouse_
ни в коем случае !
безусловное разрушение ms должно происходить явно только в случае возникновения искл.ситуации
если же таковая не возникла в ходе исполнения SendStream, то стрим-объект будет автоматически разрушен в любом случае передан ли ms успешно и полностью или при очередной pending-операции произошел неожиданный отказ трансп.канала
Rouse_ (2004-04-16 11:21:00) [9]> [8] Digitman © (16.04.04 10:25)
Вероятно finally а не except?
Digitman (2004-04-16 10:25:00) [10]
var
ms: TMemorystream;
msg: String;
...
msg := 'Сообщение';
with ServerSocket.Socket do
for i:= 0 to ActiveConnections - 1 do
begin
ms := TMemoryStream.Create;
try
ms.WriteBuffer(PChar(msg)^, Length(msg) + 1);
ms.Position := 0;
Connections[i].SendStream(ms);
except
ms.Free;
end;
end;
Rouse_ (2004-04-15 22:29:00) [11]Любое исключение необходимо обрабатывать...
MasterDenis (2004-04-15 22:19:00) [12]А если в момент перебора от 0 до X одно из соединений закрылось? Исключение обрабатывать?
Не праздное любопытство - сам голову над этим ломаю.
Digitman (2004-04-05 11:55:00) [13]x = ServerSocket.Socket.ActiveConnections - 1
Verg (2004-04-05 11:52:00) [14]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1079380703&n=4
Читай последние две строки в сообщении №14
lena19 (2004-04-05 11:49:00) [15]for n:=0 to x do .....connecktions[n].send...
а чему равен x
lena19 (2004-04-05 11:45:00) [16]for n:=0 to x do .....connecktions[n].send...
а чему равен x
Anatoly Podgoretsky (2004-04-05 09:31:00) [17]Перебрать всех клиентов в цикле