Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.20;
Скачать: CL | DM;

Вниз

clientSocket посылка строкой   Найти похожие ветки 

 
Vikindos ©   (2008-03-27 15:41) [0]

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

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

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

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


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


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


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


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


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


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


 
DVM ©   (2008-03-27 17:07) [3]


> Vikindos ©

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


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

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

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


 
Vikindos ©   (2008-03-28 02:01) [5]

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

как?


 
Vikindos ©   (2008-03-28 02:15) [6]

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


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


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


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


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


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

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


 
Vikindos ©   (2008-03-28 20:48) [9]

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


 
Vikindos ©   (2008-03-28 20:49) [10]

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);


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


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


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


 
DVM ©   (2008-03-28 23:34) [12]


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

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


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

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


кстати.


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.09.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1247728376
Cobalt
2009-07-16 11:12
2009.09.20
Как сохранить число в трех однобайтовых.


15-1248423609
Palladin
2009-07-24 12:20
2009.09.20
Неверный путь к оболочке у пользователя, FreeBSD


8-1196600166
Chaser
2007-12-02 15:56
2009.09.20
Визуализация и одновременная запись звука


15-1248119778
DVM
2009-07-20 23:56
2009.09.20
Вопрос по препроцессору С


15-1248039948
Германн
2009-07-20 01:45
2009.09.20
Concerto for Group and Orchestra