Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
2-1247657267
Алексей85
2009-07-15 15:27
2009.09.20
Позиция в DBGrid


15-1246915947
Германн
2009-07-07 01:32
2009.09.20
Система "Экспресс-3" от РЖД


2-1247921743
Igor2010
2009-07-18 16:55
2009.09.20
организовать циклы нужно


2-1247632669
wiser87
2009-07-15 08:37
2009.09.20
Поведение TEdit на модальной форме.


15-1248413989
Художник
2009-07-24 09:39
2009.09.20
Функции в fpc





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский