delphi LF在TIdTCP服务器中的ReadLn和TIdTCPC客户端中的WriteLn上的使用

3phpmpom  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(120)

在我的TIdTCPServer.OnConnect事件中,我使用以下方式接收信息:

AContext.Connection.IOHandler.ReadLn(LF, 5000)

我已经读到ReadLn()在字符串的末尾需要LF,那么我需要在末尾添加LF吗?

TCPClient.IOHandler.WriteLn('TEXT' + LF);

我在WriteLn()中看到它已经自动包含了:

procedure TIdIOHandler.WriteLn(const AOut: string;
  AByteEncoding: IIdTextEncoding = nil
  {$IFDEF STRING_IS_ANSI}; ASrcEncoding: IIdTextEncoding = nil{$ENDIF}
  );
begin
                                                                                  
  // which encodes a LF character to byte $25 instead of $0A (and decodes
  // byte $0A to character #$8E instead of #$A).  To account for that, don't
  // encoding the CRLF using the specified encoding anymore, force the encoding
  // to what it should be...
  //
  // But, what to do if the target encoding is UTF-16?
  {
  Write(AOut, AByteEncoding{$IFDEF STRING_IS_ANSI, ASrcEncoding{$ENDIF);
  Write(EOL, Indy8BitEncoding{$IFDEF STRING_IS_ANSI, Indy8BitEncoding{$ENDIF);
  }

  // Do as one write so it only makes one call to network
  Write(AOut + EOL, AByteEncoding
    {$IFDEF STRING_IS_ANSI}, ASrcEncoding{$ENDIF}
    );
end;
waxmsbnn

waxmsbnn1#

正如您所注意到的,IOHandler.WriteLn()在每个字符串的末尾自动发送EOL(也称为CRLF)。这是因为大多数文本Internet协议使用CRLF
如果省略了终止符,IOHandler.ReadLn()默认会处理LF,但是只要终止符是LF(隐式或显式),那么IOHandler.ReadLn()也会处理CRLF。所以,不要把你自己的LF传递给IOHandler.WriteLn(),例如:

TCPClient.IOHandler.WriteLn('TEXT');

如果您想发送LF而不是CRLF,请使用IOHandler.Write(),例如:

TCPClient.IOHandler.Write('TEXT' + LF);

相关问题