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

时间:2011-04-28 14:06:09

标签: delphi sockets newline

我正在研究Delphi中必须符合ADC standard protocol的程序。此协议指定每行以换行符(#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;

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

2 个答案:

答案 0 :(得分:5)

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

Windows上sLineBreak的通常值为#13#10 - 首先是回车符,然后是换行符。序列#10#13不是我所知道的任何平台上的换行符。

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

答案 1 :(得分:3)

嗯,您链接的页面似乎在消息语法中牢固地说明新行是一个字符:

eol ::= #x0a

虽然sLineBreak是Windows上的两个字符,但是你声明了。