当IdTCPClient.IOHandler.ReadStream()时,连接正常关闭!
我是delphi的新手,这是我的第一个项目。 这里有一些代码:
procedure TForm1.Button2Click(Sender: TObject);
responseStringFromServer:TStringStream;
begin
try
if IdTCPClient1.Connected then
begin
dataSentToDevice:= 'http/1.0 content-length: 344 content-type: text/xml <?xml version="1.0" encoding="UTF-8" ?> ...'
IdTCPClient1.IOHandler.WriteLn(dataSentToDevice);
responseStringFromServer := TStringStream.Create;
IdTCPClient1.IOHandler.ReadStream(responseStringFromServer);
...
我有一台设备连接到本地网络。 我设法成功地连接到它。 发送命令也在工作,但是当我这样做
IdTCPClient1.IOHandler.ReadStream(responseStringFromServer);
然后等待设备完成处理并发生异常:“连接关闭良好”。 所以我无法读取设备本应发送给我的数据。 设备没有关闭。 我已阅读其他帖子,并且我明白设备本身会断开连接。
我有一个与它通信的演示程序,它工作正常。 我需要在丢弃连接之前获得响应xml。
此外,请求是HTTP,我正在使用IdTCPClient(我需要使用XML请求,我不知道如何使用TidHTTP)。 可能是在设备发送响应之后,它会断开连接,以便我的tcpclient在接收数据之前获取连接丢弃标志。
任何帮助,将不胜感激!
此外,请求是HTTP,我正在使用IdTCPClient(我需要使用XML请求,我不知道如何使用TidHTTP)。
使用IdHTTP很简单...
您调用ReadStream()的方式,它将按网络字节顺序将前4个字节(或8个字节,如果TIdIOHandler.LargeStream属性为True)解释为Integer(或Int64),并指定数据的长度,那么它会尝试读取那么多字节。 设备是否实际发送了这样的长度值? 如果不是,则ReadStream()将尝试读取错误的字节数。 一个EIdConnClosedGracefully异常意味着设备在其最后关闭套接字。 因此,无论是设备在发送数据后立即关闭连接,还是等待您发送下一个命令时都会立即关闭连接,因为您正在等待前一个命令中的错误数据,所以您无法执行此操作。
正如@Remy Lebeau和文档所说的(当您的编辑插入符号超过ReadStream语句时,请按F1键):
AByteCount表示IOHandler要读入AStream的字节数 。 当AByteCount包含-1并且AReadUntilDisconnect包含False时, 字节数将从IOHandler读取为Integer值 。 AStream的大小会根据IOHandler预期的大小进行调整。
当您连接到一端以INDY WriteStream编写的服务器,另一端以ReadStream编写的服务器或任何其他语言(如果您按INDY客户端的预期发送该字节)时,这非常有用。
如果您正在从设备读取数据,请确保该设备正在将该信息发送到数据流的前端或更改读取数据的方式。 如果您知道流的大小,只需传递第二个参数:AByteCount。 如果设备将在流结束时关闭通道,则将第一个参数传递为-1,将第三个参数传递为True:AReadUntilDisconnect。
如果设备发送未知长度的文本,但使用已知的终止符(如CR / LF),则最好使用IOHandler的ReadLn方法来获取该字符串。
看看是否都不符合你的需求,看一看TIOHandlerClass和RTFM的Read *方法,找到正确的方法来获取设备发送的数据。
链接地址: http://www.djcxy.com/p/76467.html上一篇: Connection Closed Gracefully when IdTCPClient.IOHandler.ReadStream()!
下一篇: Indy or ICS or ?