![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
tserversocket and tclientsocket
P.D.YU © (2004-05-13 10:14:00)почему при быстрой отправке сообщений строки начинают склеиваться?
вот кусок кода
у сервера
....
procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
listbox1.clear;
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText('#N');
end;
....
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var s: string;
i: Integer;
begin
s:=socket.receivetext;
if Copy(s,1,2) = '#N' then begin
Delete(s,1,2);
ListBox1.Items.Add(s);
s := '#U';
for i := 0 to ListBox1.Items.Count-1 do
s := s+ListBox1.Items[i]+';';
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText(s);
Exit;
end;
end;
...
у клиента
...
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s,from_,to_: string;
begin
s := Socket.ReceiveText;
if Copy(s,1,2) = '#U' then begin
Delete(s,1,2);
ListBox1.Items.Clear;
while Pos(';',s) > 0 do begin
ListBox1.Items.Add(Copy(s,1,Pos(';',s)-1));
Delete(s,1,Pos(';',s));
end;
Exit;
end;
end;
...
все работает нрмально на 2-3 компах но когда запустишь на 5-6 то клиент начинает получать строки типа "#UDenis;andrey,pc5,pc6,pc7;#UDenis;andrey,pc5,pc6,pc7;"
похоже они просто склеиваются
может посоветуете что?
P.D.YU (2004-05-14 10:01:00) [1]искал искал так ничего и не надыбал вы просто скажите как разослать сообщение всем подключенным клиентам?
Verg (2004-05-13 12:34:00) [2]
> P.D.YU (13.05.04 11:52)
Я конечно извиняюсь, но ты не можешь посмотреть Help? У тебя кто-то скрал исходники VCL, в частности sockets.pas?
P.D.YU (2004-05-13 11:52:00) [3]а что за фрукт tcpserver и tcpclient в d7?
есть ли у tcpserver а аналого свойства connections в serversocket?
Verg (2004-05-13 11:09:00) [4]
> [2] P.D.YU (13.05.04 10:58)
> а если использвать инди компоненты вожможено ли такое же?
Инди отчасти сделает эту работу за тебя, т.к. в Ф-ции ReceiveLn можно определить свой разделитель строк (в данном случае ";"). Оно само будет грамотно накапливть принимаемую из гнезда информацию, отслеживая появление этого разделителя и т.д.
Но режим сокетов - блокирующий, со всеми вытекающими.
P.D.YU (2004-05-13 10:58:00) [5]а если использвать инди компоненты вожможено ли такое же?
Verg (2004-05-13 10:36:00) [6]
> может посоветуете что?
Учесть этот факт.
TCP/IP рассматривает передаваемые/принимаемые данные как неструктуированный поток байтов. Ему глубоко плевать, по большому счету, порциями какого размера ты пополняешь этот поток на передающей стороне. Так же ему все равно какими кусками ты будешь извлекать данные из принятого потока на приемной стороне.
ReceiveText - просто принимает столько байтов, сколько их оказалось в приемном буфере сокета на момент вызова этой ф-ции. Т.е. все, успевшие "добраться" на текущий момент времени.