Конференция "Сети" » clientSocket посылка строкой [D7, WinXP]
 
  • Vikindos © (27.03.08 15:41) [0]
    У меня идет очень быстрый обмен пакетами
    for i:=1 to 9999 do
    clientSocket1.Socket.SendText(text);

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

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

    как мне это исправить?
  • Сергей М. © (27.03.08 15:43) [1]

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


    А с какого перепугу он должен приходить в 5 переменных ?
  • Сергей М. © (27.03.08 15:43) [2]

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


    А с какого перепугу он должен приходить в 5 переменных ?
  • DVM © (27.03.08 17:07) [3]

    > Vikindos ©

    разделители вставь
  • kami (27.03.08 19:05) [4]
    http://www.delphimaster.ru/articles/socksrv/index.html

    Читать раздел "Почему несколько блоков при передаче могут обьединяться в один"
  • Vikindos © (28.03.08 02:01) [5]
    >>разделители вставь

    как?
  • Vikindos © (28.03.08 02:15) [6]
    всмысле в строке поставить метку для разделения?
  • Сергей М. © (28.03.08 08:20) [7]

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


    Можно и метку, если прикладной протокол исключительно текстовый.
    Но альтернативно можно добавлять и префикс размера сообщения.
  • DVM © (28.03.08 12:32) [8]

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

    Перевод строки вставь #13#10, например.
  • Vikindos © (28.03.08 20:48) [9]
    Слушай, 1310 не проходит, если только в ресиве не сделать поиск конца строки на 1310.
  • Vikindos © (28.03.08 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);

  • Сергей М. © (28.03.08 21:33) [11]

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


    Вот чтобы не иметь на свою задницу подобного геморроя как раз и придуман префикс размера сообщения.
  • DVM © (28.03.08 23:34) [12]

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

    Ясен пень, при приеме надо предпринимать какие то усилия для поиска разделителей. Но это же элементарно. Все текстовые протоколы используют разделители или Content-Length сообщения. Или и то и другое вместе.
  • Vikindos © (29.03.08 00:19) [13]
    procedure TForm1.ClientSocket1Read(Sender: TObject;
    Socket: TCustomWinSocket);
    var tmpStr:TStringList;
    begin
    tmpStr:=TStringList.Create;
    tmpStr.SetText(PChar(Socket.ReceiveText));
    end;



    кстати.
  • Сергей М. © (29.03.08 10:03) [14]

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


    Код никуда не годится.
    Кстати.
  • Григорьев Антон © (01.04.08 08:12) [15]
    Я ещё один маленький секрет могу открыть: в TCP пакеты могут не только склеиваться, но и разбиваться, т.е. когда вы отправляете одну длинную строку, на противоположную сторону она может прийти по частям, и хотя такое бывает намного реже, это тоже надо учитывать.
 
Конференция "Сети" » clientSocket посылка строкой [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.002]