- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Delphi XE5 的新手,主要使用 VB.Net 和一些 Java。我试图从传入的 TCP 连接中读取未知数量的字节,但没有运气研究如何确定输入缓冲区中有多少字节要读取。似乎我尝试的每种方法(即 ReadBytes、ReadStream 等)都要求我明确告诉他们要读取多少字节或阻塞多少字节。我只需要一种方法来确定输入缓冲区中有多少字节,以便我可以使用 ReadBytes 来读取它们。
begin
Client.IOHandler.CheckForDataOnSource(300);
if Not Client.IOHandler.InputBufferIsEmpty then
Client.IOHandler.ReadBytes(rxBuf);
end;
为了不阻塞,我需要提供输入缓冲区中的字节数,但我无法确定如何做到这一点。我尝试了 InputBuffer.Size,但返回的数字比可能存在的数字大得多。
我现在尝试了以下方法:
begin
if Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.CheckForDataOnSource(1000);
if Not Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
end;
end
else
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
end;
当我设置断点并单步执行代码时,代码会跳过 ExtractToBytes,并且 rxBuf 保持为零,即使输入缓冲区中有数据也是如此。为什么?
我之前遗漏了一些代码。这是整个事情。
while stop-start <MainForm.Timeout do
begin
if Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.CheckForDataOnSource(1000);
stop := Ticks;
if Not Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
break;
end;
end
else
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
break;
end;
我知道缓冲区中有数据,因为单步执行代码会进入中断;但是 ExtractToBytes(rxBuf) 没有被评估并且不知道为什么。
最佳答案
InputBuffer.Size
是 InputBuffer
内存中的实际物理字节数。它不能大于实际存储的值。 InputBufferIsEmpty()
只是返回是否 InputBuffer.Size > 0
。
begin
if Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.CheckForDataOnSource(1000);
Client.IOHandler.CheckForDisconnect;
if Client.IOHandler.InputBufferIsEmpty then Exit;
end;
Client.IOHandler.ReadBytes(rxBuf, Client.IOHandler.InputBuffer.Size);
end;
或者,无条件地使用 InputBuffer.ExtractToBytes()
提取 InputBuffer
中当前的内容,即使它碰巧是空的:
begin
if Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.CheckForDataOnSource(1000);
Client.IOHandler.CheckForDisconnect;
if Client.IOHandler.InputBufferIsEmpty then Exit;
end;
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
end;
或者,您可以将 -1
传递给 ReadBytes()
,它告诉它返回 InputBuffer
中当前的任何内容(它将首先调用 IOHandler.ReadFromSource()
填充 InputBuffer
,然后从中提取):
begin
Client.IOHandler.ReadBytes(rxBuf, -1, False);
end;
更新:无论是否读取任何内容,您的循环都会调用break
。那是你真正想要的吗?如果没有,那么您需要将最后一个 break
移动到 begin/end
block 中,以便仅在调用 ExtractToBytes()
时才对其进行求值:
while GetTickDiff(start, Ticks) < MainForm.Timeout do
begin
if Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.CheckForDataOnSource(1000);
if Not Client.IOHandler.InputBufferIsEmpty then
begin
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
break;
end;
end
else
begin
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
break;
end;
end;
在这种情况下,您可以稍微简化循环:
start := Ticks;
while Client.IOHandler.InputBufferIsEmpty do
begin
if GetTickDiff(start, Ticks) >= MainForm.Timeout then Break;
Client.IOHandler.CheckForDataOnSource(1000);
end;
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
在这种情况下,您可以完全摆脱循环并使用 Indy 自己的超时:
Client.IOHandler.CheckForDataOnSource(MainForm.Timeout);
Client.IOHandler.InputBuffer.ExtractToBytes(rxBuf);
或者:
Client.IOHandler.ReadTimeout := MainForm.Timeout;
Client.IOHandler.ReadBytes(rxBuf, -1, False);
关于Delphi IOHandler 读取未知字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21944160/
我是 Delphi XE5 的新手,主要使用 VB.Net 和一些 Java。我试图从传入的 TCP 连接中读取未知数量的字节,但没有运气研究如何确定输入缓冲区中有多少字节要读取。似乎我尝试的每种方法
我在使用 idTCPClient 从 telnet 服务器读取缓冲区的以下代码中遇到问题: procedure TForm2.ReadTimerTimer(Sender: TObject); var
有什么区别: AContext.Socket.ReadBytes(...); vs AContext.IOHandler.ReadBytes(...); 它们的工作原理一样吗?或者可能是 IOHan
我是delphi新手,这是我的第一个项目。这是一些代码: procedure TForm1.Button2Click(Sender: TObject); responseStringFromServe
我正在使用 Indy 从 URL 地址获取 JSON。我的代码使用 TIdSSLIOHandlerSocketOpenSSL 作为 TIdHTTP 的 IOHandler。 var IdHTTP: T
我有一个在运行时创建的 TIdHTTP 对象,该对象的 IOHandler 和 Compression 属性设置为也在运行时创建的对象。如果我对 TIdHTTP 对象调用 Free,这是否会自动释放分
今天我在使用 Indy 10(Delphi 2010 附带)时遇到了奇怪的行为。问题是这样的: 假设我们的客户端中有一个 IdTcpClient,服务器应用程序中有一个 IdTcpServer,并且
我试图将发送的文本文件显示到 memo.lines,而不将其保存到磁盘 来自服务器 try Ms := TMemoryStream.Create; Ms.LoadFromFile('upd
当我尝试在我的网络应用程序上加载我的训练模型时,我收到以下错误,从路径正确到达 json(我尝试使用 console.log 打印并且没问题),似乎问题是当 tf.loadLayers 尝试加载它时.
我是一名优秀的程序员,十分优秀!