Delphi IdTCPClient[2] Write、WriteLn、ReadLn - 字符串的写入和接收
Delphi IdTCPClient[2] Write、WriteLn、ReadLn - 字符串的写入和接收
1、Write //使用连接发送字符串
1 2 3 4 5 6 7 8 9 | procedure TIdTCPConnection . Write ( const AOut: string ); var LOutLen: Integer ; Begin LOutLen := Length(AOut); if LOutLen > 0 then begin WriteBuffer( Pointer (AOut)^, LOutLen); end ; End ; //Write |
- Write是用于通过连接发送AOut中指定的字符串的过程。当AOut为空字符串时,不执行任何操作。
- Write调用WriteBuffer以从缓冲区执行输出。
- Write不会向输出缓冲区添加行尾序列。
2、WriteLn //将字符串值写入对等连接。
1 2 3 4 | procedure TIdTCPConnection . WriteLn ( const AOut: string = '' ); begin Write (AOut + EOL); end ; |
WriteLn是用于将AOut中指定的字符串值发送到对等连接的过程。WriteLn在发送到对等连接时,将EOL字符序列附加到AOut中的值。
1 2 3 4 5 6 7 | CHAR0 = # 0 ; BACKSPACE = # 8 ; LF = # 10 ; CR = # 13 ; EOL = CR + LF; TAB = # 9 ; CHAR32 = # 32 ; |
与Write的区别可以简单理解为,WriteLn 是带了回车换行的信息 -- 滔Roy 2022.11.21
3、ReadLn //从Indy缓冲区读取一行字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | function TIdTCPConnection . ReadLn(ATerminator: string = LF; const ATimeout: Integer = IdTimeoutDefault; AMaxLineLength: Integer = - 1 ): string ; var LInputBufferSize: Integer ; LSize: Integer ; LTermPos: Integer ; begin if AMaxLineLength = - 1 then begin AMaxLineLength := MaxLineLength; end ; // User may pass '' if they need to pass arguments beyond the first. if Length(ATerminator) = 0 then begin ATerminator := LF; end ; FReadLnSplit := False ; FReadLnTimedOut := False ; LTermPos := 0 ; LSize := 0 ; repeat LInputBufferSize := InputBuffer . Size; if LInputBufferSize > 0 then begin LTermPos := MemoryPos(ATerminator, PChar (InputBuffer . Memory) + LSize, LInputBufferSize - LSize); if LTermPos > 0 then begin LTermPos := LTermPos + LSize; end ; LSize := LInputBufferSize; end ; //if if (LTermPos - 1 > AMaxLineLength) and (AMaxLineLength <> 0 ) then begin if MaxLineAction = maException then begin raise EIdReadLnMaxLineLengthExceeded . Create(RSReadLnMaxLineLengthExceeded); end else begin FReadLnSplit := True ; Result := InputBuffer . Extract(AMaxLineLength); Exit; end ; // ReadFromStack blocks - do not call unless we need to end else if LTermPos = 0 then begin if (LSize > AMaxLineLength) and (AMaxLineLength <> 0 ) then begin if MaxLineAction = maException then begin raise EIdReadLnMaxLineLengthExceeded . Create(RSReadLnMaxLineLengthExceeded); end else begin FReadLnSplit := True ; Result := InputBuffer . Extract(AMaxLineLength); Exit; end ; end ; // ReadLn needs to call this as data may exist in the buffer, but no EOL yet disconnected CheckForDisconnect( True , True ); // Can only return 0 if error or timeout FReadLnTimedOut := ReadFromStack( True , ATimeout, ATimeout = IdTimeoutDefault) = 0 ; if ReadLnTimedout then begin Result := '' ; Exit; end ; end ; until LTermPos > 0 ; // Extract actual data Result := InputBuffer . Extract(LTermPos + Length(ATerminator) - 1 ); // Strip terminators LTermPos := Length(Result) - Length(ATerminator); if (ATerminator = LF) and (LTermPos > 0 ) and (Result[LTermPos] = CR) then begin SetLength(Result, LTermPos - 1 ); end else begin SetLength(Result, LTermPos); end ; end ; //ReadLn |
参数:
- ATerminator //表示特定协议的行尾符号。如果需要数据,并且不需要自定义的行尾符号,则可以使用默认的ATerminator值(#0)。A终端值包括ATimeout //超时(毫秒)。默认值IdTimeoutInfinite。
- #0-默认换行符(#10)
- LF-默认换行符(#10)
- CR-回车(#13)
- EOL-行尾(回车+换行)
其他:如果缓冲区中没有终止符(ATerminator),ReadLn将通过ReadFromStack方法从TCP堆栈中读取更多字节。使用自定义超时(ATimeout)值更改超时发生前等待对等连接响应的毫秒数。ATimeout的默认值为IdTimeoutInfinite。如果对等连接过早关闭或发生超时,ReadLn将返回空字符串(“”)。当ReadLn中出现超时条件时,ReadLnTimedOut属性设置为True。
创建时间:2022.11.21 更新时间:2022.11.21
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报