![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
socket
CrazyTemo © (2002-05-22 17:53:00)как синхронизавать socket? то есть как контролиравать передачу дааных? например когда я посилаю текст, сервер получает все в месте, а я хочу получать каждую строку отделно
Donal_Graeme (2002-05-24 09:18:00) [21]2 cyborg: у тебя не предусмотрено, что сообщения могут быть разбиты. т.е. ты отправляешь "абвгд#13#10" а получатель сперва получает "аб" а потом "вгд#13#10".
Malder (2002-05-23 21:28:00) [22]Я тоже не понял претензии Digitman"а
cyborg (2002-05-23 20:02:00) [23]Digitman ©
А что за работа неожиданным образом?
Однако работает :-). У меня всё прекрасно делит. Хотя всё может быть. Расскажите поподробнее.
Fredericco ©
:-) На том и состоит код, что разделитель видно и по нему разбивается, т.е. не понял смысл ваших слов.
А вот сбои :-), это просто беда ...
Fredericco (2002-05-23 16:51:00) [24]cyborg © >> Если на том конце всегда добавлять #13#10 если нет физических сбоев или резкого зависания системы, то на другом конце ты всегда увидишь #13#10.
Digitman (2002-05-23 11:01:00) [25]>cyborg
Это не будет работать ожидаемым образом. Неверно представляешь себе логику метода ReceiveText().
cyborg (2002-05-23 09:18:00) [26]CrazyTemo Ничего не нужно контролировать, сокет сам уже всё контролирует, вот вставь себе в программу такой код:
Const Delitel : String = #13#10;
{Разделитель строк, добавляется в конец отсылаемых данных, можно написать любой, какой нравится}
---------
{Процедура обработки мессаг S-передаваемая строка,
Socket - Передаваемый сокет откуда пришла мессага}
Procedure Process_Message(Var S : AnsiString;Var Socket: TCustomWinSocket);
Begin
{Обрабатываем здесь полученные данные}
End;
procedure TMyForm.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
Var S,_S : AnsiString;
I : Integer;
begin
S:=Socket.ReceiveText;
I:=0;
Repeat {Разделяем строку, если одновременно пришло несколько}
I:=Pos(Delitel,S); {Ищем радлелитель Delitel}
if I<>0 then {Если найден делитель, тогда ... Если не найден, то ты не добавил в конце отсылаемой строки Delitel !}
Begin
_S:=Copy(S,1,I-1);{Копируем одну мессагу}
Delete(S,1,I+Length(Delitel)-1);
{Удаляем уже скопированную мессагу}
Process_Message(_S,Socket);
{Процедура обработки мессаг где _S наша выделенная мессага}
End;
Until I=0;
end;
{Пример отправки мессаг}
Socket.SendText("Ку ку!"+Delitel); {Важно добавлять в конце каждой отправляемой строки разделитель строк Delitel}
-----------------
Всё должно работать :-) ...
KPOT (2002-05-22 18:46:00) [27]Читай по одному символу до контрольного знака