我正在研究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;
此外,服务器不必以不同的步骤发送命令,它可以一次性发送所有命令,因此需要读取整个套接字,然后通过它而不是假设一个每个插槽的命令读取。
答案 0 :(得分:5)
协议规范说“新行(代码点0x0a)结束每条消息。”这是一个单一的角色。在Delphi语法中,它是#10
或#$a
。
Windows上sLineBreak
的通常值为#13#10
- 首先是回车符,然后是换行符。序列#10#13
不是我所知道的任何平台上的换行符。
所有内容在备忘录控件中显示为一行,因为您只收到换行符,没有回车符,TMemo
要求两个字符都以一行结束。这与在记事本中加载Unix风格的文本文件相同。
答案 1 :(得分:3)
嗯,您链接的页面似乎在消息语法中牢固地说明新行是一个字符:
eol ::= #x0a
虽然sLineBreak
是Windows上的两个字符,但是你声明了。