Разбиение полученных данных через ClientSocket и ServerSocket, когда приходит несколько пакетов в одномDelphi , Интернет и Сети , СокетыРазбиение полученных данных через ClientSocket и ServerSocket, когда приходит несколько пакетов в одном
Автор: Cyborg { **** UBPFD *********** by delphibase.endimus.com **** >> Разбиение полученных данных через ClientSocket и ServerSocket, когда приходит несколько пакетов в одном. При получении нескольких данных по socket иногда приходят два и более пакета в одном. Здесь пример, как разбить при получении полученную строку на несколько отправленных. Зависимости: System, ScktComp Автор: cyborg, cyborg1979@newmail.ru, ICQ:114205759, Бузулук Copyright: Собственное написание (Осипов Евгений Анатольевич) Дата: 23 мая 2002 г. ***************************************************** } {Разделитель строк, добавляется в конец отсылаемых данных, можно написать любой, какой нравится/какой вам подойдёт} 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); Программный код, представленный в этом примере, является решением на языке Delphi для разделения полученных данных из сокета на несколько строк, когда приходит сразу несколько пакетов. Вот подробное описание кода:
В примере использования показано, как отправить данные из сокета с добавленным разделителем:
или
или
Это позволяет конечной стороне разделить входящие данные на несколько строк с помощью разделителя. Код хорошо структурирован и легко понятен. Однако, он может быть улучшен добавлением обработки ошибок для случаев, когда символ-разделитель не найден в полученной строке или при обработке выделившейся подстроки. Кроме того, процедура Разбиение полученных данных через ClientSocket и ServerSocket, когда приходит несколько пакетов в одном - пример кода на Delphi для разделения строки на несколько отправленных пакетов. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |