在Delphi中从套接字读取换行符
我正在用Delphi开发一个程序,它必须符合。此协议指定每行以换行符(#10#13或sLineBreak)终止。问题是,换行符似乎无法在从服务器到程序的过程中幸存下来。从套接字读取数据似乎只是简单地将其作为一条庞大的线。我认为这与程序显示调试消息的方式有关(对于TMemo对象),但是Pos(sLineBreak,Buf)总是返回0(意味着它找不到字符串) 我的代码:在Delphi中从套接字读取换行符,delphi,sockets,newline,Delphi,Sockets,Newline,我正在用Delphi开发一个程序,它必须符合。此协议指定每行以换行符(#10#13或sLineBreak)终止。问题是,换行符似乎无法在从服务器到程序的过程中幸存下来。从套接字读取数据似乎只是简单地将其作为一条庞大的线。我认为这与程序显示调试消息的方式有关(对于TMemo对象),但是Pos(sLineBreak,Buf)总是返回0(意味着它找不到字符串) 我的代码: procedure OnRead(Sender: TObject; Socket: TCustomWinSocket); begi
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;
此外,服务器不必在不同的步骤中发送命令,它可以一次发送所有命令,其中包含换行符,因此需要读入整个套接字,然后进行遍历,而不是假设每个套接字读取一个命令。Hmm,您链接的页面似乎在消息语法中明确表示新行是一个字符:
eol ::= #x0a
而在Windows上,sLineBreak是两个字符,正如您所说。协议规范中说的“每条消息都以换行符(代码点0x0a)结尾。”这是一个字符。在Delphi语法中,它是
#10
或#$a
在Windows上,sLineBreak
的通常值为#13#10
——回车首先出现,然后换行。序列#10#13
在我所知道的任何平台上都不是换行符
在memo控件中,所有内容都显示为一行,因为您只接收换行字符,没有回车符,
TMemo
希望两个字符都结束一行。这与在记事本中加载Unix样式的文本文件是一样的。@Andreas,这是BNF,而不是Delphine命令,每次套接字读取都不应该被假定,TCP数据包以随机块的形式到达。不正常,@Remy。什么程序生成这种格式,并且在这样做时被认为是正确的?我想一些程序可能会接受它作为一个兼容性功能。对不起,我误读了所写的内容。我把它看作是#13#10
,而不是#10#13
。