-
У меня идет очень быстрый обмен пакетами for i:=1 to 9999 do clientSocket1.Socket.SendText(text);
приходит текст не в одну переменную: text text text text
а он сливается в одну строку text+text+text+text
как мне это исправить?
-
> приходит текст не в одну переменную
А с какого перепугу он должен приходить в 5 переменных ?
-
> приходит текст не в одну переменную
А с какого перепугу он должен приходить в 5 переменных ?
-
> Vikindos ©
разделители вставь
-
-
>>разделители вставь
как?
-
всмысле в строке поставить метку для разделения?
-
> в строке поставить метку для разделения?
Можно и метку, если прикладной протокол исключительно текстовый. Но альтернативно можно добавлять и префикс размера сообщения.
-
> всмысле в строке поставить метку для разделения?
Перевод строки вставь #13#10, например.
-
Слушай, 1310 не проходит, если только в ресиве не сделать поиск конца строки на 1310.
-
1310 не отделяет сообщение, а просто добавляется к сообщению. const
Delitel: string = #13#10;
procedure Process_Message(var S: AnsiString; var Socket: TCustomWinSocket);
begin
end;
procedure TMyForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
S1, S2: AnsiString;
I: Integer;
begin
S1 := Socket.ReceiveText;
I := 0;
repeat
I := Pos(Delitel, S1);
if I <> 0 then
begin
S2 := Copy(S1, 1, I - 1);
Delete(S1, 1, I + Length(Delitel) - 1);
Process_Message(S2, Socket);
end;
until I = 0;
end;
Пример использования:
Socket.SendText('Отправляемая строка' + Delitel);
S := 'Отправляемая строка' + Delitel;
Socket.SendText(S);
S := 'Отправляемая строка';
Socket.SendText(S + Delitel);
-
> Vikindos © (28.03.08 20:49) [10]
Вот чтобы не иметь на свою задницу подобного геморроя как раз и придуман префикс размера сообщения.
-
> Слушай, 1310 не проходит, если только в ресиве не сделать > поиск конца строки на 1310.
Ясен пень, при приеме надо предпринимать какие то усилия для поиска разделителей. Но это же элементарно. Все текстовые протоколы используют разделители или Content-Length сообщения. Или и то и другое вместе.
-
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var tmpStr:TStringList;
begin
tmpStr:=TStringList.Create;
tmpStr.SetText(PChar(Socket.ReceiveText));
end; кстати.
-
> Vikindos © (29.03.08 00:19) [13]
Код никуда не годится. Кстати.
-
Я ещё один маленький секрет могу открыть: в TCP пакеты могут не только склеиваться, но и разбиваться, т.е. когда вы отправляете одну длинную строку, на противоположную сторону она может прийти по частям, и хотя такое бывает намного реже, это тоже надо учитывать.
|