在我的
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
)。如果省略终止符,IOHandler.ReadLn()
默认会期望 LF
,但每当终止符是 LF
时,ReadLn()
也会处理 CRLF
。因此,请勿将您自己的 LF
传递给 WriteLn()
,例如:
TCPClient.IOHandler.WriteLn('TEXT');
如果您想单独发送
LF
而不是CRLF
,请使用Write()
代替,例如:
TCPClient.IOHandler.Write('TEXT'+LF);