Форум: "Сети";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Внизсервер. отправка всем клиентам Найти похожие ветки
← →
lena19 (2004-04-05 08:51) [0]Всем привет
Народ подскажите как отправить
С компонента serversocket данные всем клиентам ?
← →
Anatoly Podgoretsky © (2004-04-05 09:31) [1]Перебрать всех клиентов в цикле
← →
lena19 (2004-04-05 11:45) [2]for n:=0 to x do .....connecktions[n].send...
а чему равен x
← →
lena19 (2004-04-05 11:49) [3]for n:=0 to x do .....connecktions[n].send...
а чему равен x
← →
Verg © (2004-04-05 11:52) [4]http://delphimaster.net/view/6-1079380703/
Читай последние две строки в сообщении №14
← →
Digitman © (2004-04-05 11:55) [5]x = ServerSocket.Socket.ActiveConnections - 1
← →
MasterDenis © (2004-04-15 22:19) [6]А если в момент перебора от 0 до X одно из соединений закрылось? Исключение обрабатывать?
Не праздное любопытство - сам голову над этим ломаю.
← →
Rouse_ © (2004-04-15 22:29) [7]Любое исключение необходимо обрабатывать...
← →
Digitman © (2004-04-16 10:25) [8]
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-16 11:21) [9]> [8] Digitman © (16.04.04 10:25)
Вероятно finally а не except?
← →
Digitman © (2004-04-16 11:29) [10]
> Rouse_
ни в коем случае !
безусловное разрушение ms должно происходить явно только в случае возникновения искл.ситуации
если же таковая не возникла в ходе исполнения SendStream, то стрим-объект будет автоматически разрушен в любом случае передан ли ms успешно и полностью или при очередной pending-операции произошел неожиданный отказ трансп.канала
← →
Digitman © (2004-04-16 11:34) [11]
> Rouse
по сути, использование здесь стрим-объекта и метода SendStream позволяет оч просто организовать индивидуальную для каждого клиента буферизацию передаваемых ему в неблок.режиме данных и легко избежать геморроя с необходимостью явной обработки OnClientWrite - в случае со стрим-передачей компонент сам обработает все FD_WRITE-события, передавая стрим кусок за куском, пока весь стрим не будет передан
← →
Rouse_ © (2004-04-16 13:32) [12]Да действительно, что-то уже к концу недели мозги кипят :)
← →
Digitman © (2004-04-16 13:39) [13]бывает) ... тяпница ж сегодня !)
← →
Piter © (2004-04-17 14:35) [14]MasterDenis (15.04.04 22:19) [6]
А если в момент перебора от 0 до X одно из соединений закрылось? Исключение обрабатывать?
Можно использоватьfor ... downto
Хотя тоже есть свои проблемы...
Digitman (16.04.04 10:25) [8]
Length(msg) + 1
А почему не просто length(Msg) ?
← →
Adil (2004-04-17 22:31) [15]Можно делать так:
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;
Это самый примитивный вариант.
← →
SergP © (2004-04-18 11:06) [16]>Adil (17.04.04 22:31)
ИМХО не пройдет. При отконективании или приконективании нового клиента номера подключений могут поменяться. Поэтому кто-то из клиентов может получить 2 раза одно и то-же, а кто-то нифига...
Хотя вообще-то хз.
← →
Digitman © (2004-04-18 11:49) [17]
> почему не просто length(Msg) ?
потому что автор никак не оговорил свой фактический ПИО
в этих условиях единственным способом разграничивать строковые сообщения в потоке принимаемых есть способ сканирования вх.потока на предмет обнаружения терминирующего нуля, отправляемого передающей стороной как символ конца строки
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c