При работе с TCP-коммуникациями в Delphi, разработчики часто сталкиваются с проблемами, связанными с переводом строк и корректной передачей данных между клиентом и сервером. В данной статье мы рассмотрим типичную проблему, связанную с добавлением символа перевода строки в начало каждой строки, отправляемой клиентом, и предложим два варианта её решения.
Проблема
Разработчик столкнулся с ошибкой, из-за которой при повторной отправке строки из TIdTCPClient в TIdTCPServer к строке добавлялся символ перевода строки в начале. Это происходило после первого успешного выполнения кода. Проблема была обнаружена в процедурах ButtonSendStringClick и IdTCPServer1Execute.
Пример кода
procedure TClientForm.ButtonSendStringClick(Sender: TObject);
var
I: integer;
List: TList;
begin
List := ClientList.LockList;
try
for I := 0 to (List.Count- 1) do
begin
TidTCPClient(List[I]).IOHandler.WriteLn('Hello'+'|x|');
end;
finally
ClientList.UnlockList;
end;
Edit1.Text := '';
end;
procedure TClientForm.IdTCPServer1Execute(AContext: TIdContext);
var
LLine: string;
begin
LLine := AContext.Connection.IOHandler.ReadLn('|x|');
OutputDebugString(PChar(LLine));
end;
Подтверждённое решение
Проблема заключается в использовании метода WriteLn(), который добавляет символы перевода строки (CRLF) в конец передаваемой строки. С другой стороны, ReadLn() останавливается на чтении, когда встречает указанную в параметре строку-терминатор. В результате отправляется строка 'Hello|x|#13#10', но читается только 'Hello|x|', оставляя символы перевода строки в буфере сокета для следующего чтения.
Варианты решения
Используйте метод Write() вместо WriteLn(), чтобы избежать добавления CRLF. При этом в ReadLn() следует оставить указанный терминатор.
Write('Hello|x|');
LLine := ReadLn('|x|');
Перестаньте использовать пользовательский терминатор в ReadLn(). Передайте строку без терминатора в WriteLn(), и ReadLn() не будет использовать терминатор, его стандартный терминатор — это LF, который также обрабатывает CRLF.
WriteLn('Hello');
LLine := ReadLn();
Заключение
При работе с TCP-коммуникациями важно понимать, как функционируют методы чтения и записи, и как они обрабатывают переводы строк и терминаторы. Следуя предложенным выше решениям, можно избежать типичных ошибок, связанных с неправильной передачей данных и их корректным чтением на стороне сервера.
Исправление ошибок в Delphi при работе с TCP-коммуникациями, связанные с корректной обработкой переводов строк при передаче данных между клиентом и сервером.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS