在我的
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;
正如您所指出的,
IOHandler.WriteLn()
会自动在每个字符串的末尾发送EOL
(又名CRLF
)。这是因为大多数文本互联网协议都使用 CRLF
。
如果省略终止符,IOHandler.ReadLn()
默认会期望 LF
,但每当终止符是 LF
(隐式或显式)时,IOHandler.ReadLn()
也将处理 CRLF
。因此,请勿将您自己的 LF
传递给 IOHandler.WriteLn()
,例如:
TCPClient.IOHandler.WriteLn('TEXT');
如果您想发送
LF
而不是 CRLF
,请使用 IOHandler.Write()
代替,例如:
TCPClient.IOHandler.Write('TEXT' + LF);