Автор: Cyborg WEB-сайт: http://delphibase.endimus.com { **** 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); |