Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

clientSocket посылка строкой [D7, WinXP]


Vikindos ©   (2008-03-27 15:41:00) 

У меня идет очень быстрый обмен пакетами
for i:=1 to 9999 do
clientSocket1.Socket.SendText(text);

приходит текст не в одну переменную:
text
text
text
text

а он сливается в одну строку text+text+text+text

как мне это исправить?


Григорьев Антон   (2008-04-01 08:12:00) [1]

Я ещё один маленький секрет могу открыть: в TCP пакеты могут не только склеиваться, но и разбиваться, т.е. когда вы отправляете одну длинную строку, на противоположную сторону она может прийти по частям, и хотя такое бывает намного реже, это тоже надо учитывать.


Сергей М.   (2008-03-29 10:03:00) [2]


> Vikindos ©   (29.03.08 00:19) [13]


Код никуда не годится.
Кстати.


Vikindos   (2008-03-29 00:19:00) [3]

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var tmpStr:TStringList;
begin
tmpStr:=TStringList.Create;
tmpStr.SetText(PChar(Socket.ReceiveText));
end;


кстати.


DVM   (2008-03-28 23:34:00) [4]


> Слушай, 1310 не проходит, если только в ресиве не сделать
> поиск конца строки на 1310.

Ясен пень, при приеме надо предпринимать какие то усилия для поиска разделителей. Но это же элементарно. Все текстовые протоколы используют разделители или Content-Length сообщения. Или и то и другое вместе.


Сергей М.   (2008-03-28 21:33:00) [5]


> Vikindos ©   (28.03.08 20:49) [10]


Вот чтобы не иметь на свою задницу подобного геморроя как раз и придуман префикс размера сообщения.


Vikindos   (2008-03-28 20:49:00) [6]

1310 не отделяет сообщение, а просто добавляется к сообщению.

const
 Delitel: string = #13#10;

{Процедура обработки строк, S-передаваемая строка,
 Socket - Передаваемый сокет откуда пришли данные}

procedure Process_Message(var S: AnsiString; var Socket: TCustomWinSocket);
begin
 {Обрабатываем здесь полученные данные S из сокета Socket}
end;

{Обработака события по получению данных из ClientSocket,
а так же действенно и для ServerSocket}

procedure TMyForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
 S1, S2: AnsiString;
 I: Integer;
begin
 S1 := Socket.ReceiveText; {Присваиваем S1 полученную строку из Socket}
 I := 0;
 repeat {Разделяем строку, если одновременно пришло несколько}
   I := Pos(Delitel, S1); {Ищем раздлелитель Delitel в строке S1}
   if I <> 0 then {Если найден делитель, тогда ...
     Если не найден, то вы не добавили в конце отсылаемой строки Delitel !}
   begin
     S2 := Copy(S1, 1, I - 1); {Копируем одну пришедшую строку в S2}
     Delete(S1, 1, I + Length(Delitel) - 1); {Удаляем уже скопированную строку}
     Process_Message(S2, Socket);
     {Вызываем процедуру обработки полученных строк,
     где S2 наша выделенная строка}
   end;
 until I = 0; {Повторять, пока будет не найден разделитель Delitel}
end;

Пример использования:
// При посылке данных в socket нужно
// не забывать прибавлять разделитель строк:
Socket.SendText('Отправляемая строка' + Delitel);

// или
S := 'Отправляемая строка' + Delitel;
Socket.SendText(S);

// или
S := 'Отправляемая строка';
Socket.SendText(S + Delitel);


Vikindos   (2008-03-28 20:48:00) [7]

Слушай, 1310 не проходит, если только в ресиве не сделать поиск конца строки на 1310.


DVM   (2008-03-28 12:32:00) [8]


> всмысле в строке поставить метку для разделения?

Перевод строки вставь #13#10, например.


Сергей М.   (2008-03-28 08:20:00) [9]


> в строке поставить метку для разделения?


Можно и метку, если прикладной протокол исключительно текстовый.
Но альтернативно можно добавлять и префикс размера сообщения.


Vikindos   (2008-03-28 02:15:00) [10]

всмысле в строке поставить метку для разделения?


Vikindos   (2008-03-28 02:01:00) [11]

>>разделители вставь

как?


kami   (2008-03-27 19:05:00) [12]

http://www.delphimaster.ru/articles/socksrv/index.html

Читать раздел "Почему несколько блоков при передаче могут обьединяться в один"


DVM   (2008-03-27 17:07:00) [13]


> Vikindos ©

разделители вставь


Сергей М.   (2008-03-27 15:43:00) [14]


> приходит текст не в одну переменную


А с какого перепугу он должен приходить в 5 переменных ?


Сергей М.   (2008-03-27 15:43:00) [15]


> приходит текст не в одну переменную


А с какого перепугу он должен приходить в 5 переменных ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо