Главная страница
    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.49 MB
Время: 0.005 c
2-1247822256
Tneduts
2009-07-17 13:17
2009.09.20
Удаленное подключение к базе


1-1215159636
Sashka
2008-07-04 12:20
2009.09.20
Реализуемо ли? Форма в Форме


10-1155825615
Kirill
2006-08-17 18:40
2009.09.20
1C Предприятие


15-1248417036
boriskb
2009-07-24 10:30
2009.09.20
80 лет В.М. Шукшину


1-1215616092
misha_gr
2008-07-09 19:08
2009.09.20
Контекстное меню "Открыть с помощью..."





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский