从Delphi中的套接字读取换行符

pR0*_*0Ps 2 sockets delphi newline

我正在研究Delphi中必须符合ADC标准协议的程序.此协议指定每行以换行符(#10#13或sLineBreak)终止.问题是换行符似乎没有幸存从服务器到程序的旅行.从套接字读取数据似乎只是将它全部作为一条大线.我认为它与程序显示调试消息的方式(对TMemo对象)有关,但Pos(sLineBreak,Buf)总是返回0(意味着它找不到字符串).

我的代码:

procedure OnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  //read all the data from the socket
  while Socket.ReceiveLength > 0 do
    Buf := Buf + Socket.ReceiveText;

  //use only complete lines
  while Pos(sLineBreak, Buf) > 0 do begin
    //parsing stuff
  end;
end;
Run Code Online (Sandbox Code Playgroud)

此外,服务器不必以不同的步骤发送命令,它可以一次性发送所有命令,因此需要读取整个套接字,然后通过它而不是假设每个套接字一个命令读.

Rob*_*edy 5

协议规范说"新行(代码点0x0a)结束每条消息." 这是一个单一的角色.在Delphi语法中,它是#10#$a.

sLineBreakWindows上的常用值是#13#10- 首先是回车符,然后是换行符.在#10#13我所知道的任何平台上,序列都不是换行符.

在备忘录控件中,所有内容都显示为一行,因为您只接收换行符而没有回车符,并且TMemo希望两个字符都以一行结束.这与在记事本中加载Unix风格的文本文件相同.