Форум: "Сети";
Текущий архив: 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