Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中从套接字读取换行符_Delphi_Sockets_Newline - Fatal编程技术网

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

在Delphi中从套接字读取换行符,delphi,sockets,newline,Delphi,Sockets,Newline,我正在用Delphi开发一个程序,它必须符合。此协议指定每行以换行符(#10#13或sLineBreak)终止。问题是,换行符似乎无法在从服务器到程序的过程中幸存下来。从套接字读取数据似乎只是简单地将其作为一条庞大的线。我认为这与程序显示调试消息的方式有关(对于TMemo对象),但是Pos(sLineBreak,Buf)总是返回0(意味着它找不到字符串) 我的代码: procedure OnRead(Sender: TObject; Socket: TCustomWinSocket); begi

我正在用Delphi开发一个程序,它必须符合。此协议指定每行以换行符(#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;

此外,服务器不必在不同的步骤中发送命令,它可以一次发送所有命令,其中包含换行符,因此需要读入整个套接字,然后进行遍历,而不是假设每个套接字读取一个命令。

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