Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Процедуры передачи и приема блоков данных, с учетом фрагментации и склейки пакетов, построено на TServerSocket и TClientSocket

Delphi , Интернет и Сети , Сокеты



Автор: Camsonov Aleksandr
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Процедуры передачи и приема блоков данных, с учетом фрагментации
и склейки пакетов. Построено на TServerSocket,TClientSocket ..SendText

Отправка:
пользователь создает строку 'Строка пользователя'
дорабатываем строку до '<19>Строка пользователя'
отправляем
Принимаем:
1 принятый кусок строки добавляем в конец буферной строки bstr;
2 вызываем прочедуру которая
a) удаляет (если есть ;|) часть bstr до '<'; //(это на случай ошибки,
правда такого явления я незамечал здесь но на всякий случай предусмотрел так спокойнее)
b) копирует участок '<число>' и достает из него число;
c) если длинна полученного буфера минус длинна участка '<число>' меньше bstr
то ниче не делаем и выходим из проседуры.
иначе отрезаем от bstr участок '<число>' копируем кусок bstr длинной 'число'
символов в ostr, удаляем этотже кусок из bstr.
d) передает ostr кому оно надо ибо ostr это то что послал пользоатель отдельным куском.

все. Пом очень просто алгоритм работает без отказно и ниче тут непопишеш.

Зависимости: ScktComp
Автор:       Camsonov Aleksandr, s002156@mail.ru, Tver
Copyright:   SELMAP_Group_Programmers/s002156Shurik
Дата:        2 октября 2002 г.
***************************************************** }

var
  Buffer: string = '';
{$R *.dfm}

function GetUserStringFromBuffer(var UserString: string): Boolean;
var
  i: Integer;
  bf: string;
begin
  Result := False;
  if Length(Buffer) > 0 then
    repeat
      if Length(Buffer) > 0 then
        if Buffer[1] <> '<' then
          Delete(Buffer, 1, 1);
    until (Buffer[1] = '<') or (Length(Buffer) <= 1);
  if Length(Buffer) < 3 then
    exit;
  i := 1;
  bf := '';
  repeat
    if Length(Buffer) >= i then
    begin
      inc(i);
      if Buffer[i] <> '>' then
        bf := bf + Buffer[i];
    end;
  until (Buffer[i] = '>') or (Length(Buffer) <= 1);
  if StrToInt(bf) + i > Length(Buffer) then
    exit
  else
  begin
    Delete(Buffer, 1, i);
    UserString := Copy(Buffer, 1, StrToInt(bf));
    Result := True;
    Delete(Buffer, 1, StrToInt(bf));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  s := '<' + inttostr(length(Edit1.Text)) + '>' + Edit1.Text;
  ClientSocket1.Socket.SendText(S);
  //В качестве ТЕСТА отправляю еще несколько копий этой строки
  //для того чтобы все они ушли в одном пакете. (слипание)
  ClientSocket1.Socket.SendText(S);
  ClientSocket1.Socket.SendText(S);
  ClientSocket1.Socket.SendText(S);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  GetResult: Boolean;
  UserStr: string;
begin
  Buffer := Buffer + Socket.ReceiveText;
  // в буфер приходят слипшиеся строки
  //перезапуск функции вытаскивания кусков до False (пока куски незакончатся)
  //если отправленный текст получен неполностью тоже возвращается False
  repeat
    GetResult := GetUserStringFromBuffer(UserStr);
    if GetResult then
      ShowMessage(UserStr); //передается отосланная строка
    //ЦЕЛАЯ И БЕЗ МУСОРА!
  until not GetResult;
end;

Программа на Delphi, которая реализует клиент-серверный протокол для отправки и приема блоков данных с fragmentation и reassembly пакетов. Протокол использует компоненты TServerSocket и TClientSocket, чтобы установить соединение между клиентом и сервером.

Программа состоит из нескольких процедур:

  1. GetUserStringFromBuffer: Procedure, которая принимает буферную строку в качестве входных данных и извлекает строку пользователя из нее. Она делает это, найдя символ <, извлекая число, которое следует за ним, и затем извлекая соответствующий подстрок из буфера.
  2. Button1Click: Procedure, которая вызывается при клике кнопки клиента. Она отправляет строку на сервер, состоящую из длины текста edit-контроля, за которым следуют символы < и >.
  3. ServerSocket1ClientRead: Procedure, которая вызывается, когда данные получены от клиента. Она добавляет полученные данные к буферу и затем вызывает процедуру GetUserStringFromBuffer, пока все данные не будут обработаны.

Программа использует компонент TCustomWinSocket для отправки и приема текстовых данных через соединение сокета. Метод SendText отправляет строку через сокет, а метод ReceiveText получает строку из сокета.

Некоторые наблюдения о коде:

  • Программа использует буферную строку (Buffer) для хранения входящих данных от клиентов.
  • Procedure GetUserStringFromBuffer используется для извлечения строк пользователей из буфера. Она делает это, найдя символ <, извлекая число, которое следует за ним, и затем извлекая соответствующий подстрок из буфера.
  • Программа использует цикл для повторного вызова процедуры GetUserStringFromBuffer, пока все данные не будут обработаны.
  • Программа не обрабатывает ошибки или исключения должным образом. Например, если возникает ошибка при отправке или получении данных, программа может рухнуть или поведаться неожиданно.

Некоторые предложения по улучшению кода:

  • Добавьте механизмы обработки ошибок для обработки неожиданных ситуаций, таких как сетевые ошибки или ошибки сокета.
  • Рассмотрите использование более robust метода извлечения строк пользователей из буфера, например, регулярного выражения парсера.
  • Procedure GetUserStringFromBuffer является quite сложной и может быть разбита на меньшие, более управляемые процедуры.
  • Рассмотрите добавление дополнительных механизмов журналирования или отладки для помощи в диагностике проблем с программой.

В целом, код appears to be функциональный, но может потребовать некоторых улучшений в отношении обработки ошибок и robustness.

Статья описывает процедуры передачи и приема блоков данных, с учетом фрагментации и склейки пакетов, построенные на TServerSocket и TClientSocket, и предназначена для программистов, работающих с Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сокеты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 09:10:01/0.0062148571014404/0