ReadLn TcpServer 和 WriteLn TcpClient 上 LF 的使用

问题描述 投票:0回答:1

在我的

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;
delphi indy indy10 tcpserver
1个回答
0
投票

正如您所指出的,

IOHandler.WriteLn()
会自动在每个字符串的末尾发送
EOL
(又名
CRLF
)。如果省略终止符,
IOHandler.ReadLn()
默认会期望
LF
,但每当终止符是
LF
时,
ReadLn()
也会处理
CRLF
。因此,请勿将您自己的
LF
传递给
WriteLn()
,例如:

TCPClient.IOHandler.WriteLn('TEXT');

如果您想单独发送

LF
而不是
CRLF
,请使用
Write()
代替,例如:

TCPClient.IOHandler.Write('TEXT'+LF);
© www.soinside.com 2019 - 2024. All rights reserved.