首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Indy10读取输入

从Indy10读取输入
EN

Stack Overflow用户
提问于 2014-04-24 12:23:38
回答 1查看 2.2K关注 0票数 2

我在Delphi中使用Indy10,并试图与网络上的一个TCP服务器建立一个简单的TCP连接。服务器发送一条简单的Hello消息,然后断开连接,等待另一个连接。我有以下代码,用于连接,并尝试从服务器读取消息。

代码语言:javascript
复制
with Client do
begin
  Host := '10.10.81.122';
  Port := 3490;
  Connect;

    if IOHandler.Connected then
      writeln('Connected!');

    if IOHandler.InputBufferIsEmpty then
    begin
      if  IOHandler.CheckForDataOnSource(1000) then
      begin
        writeln('Buffer size:' + IntToStr(IOHandler.RecvBufferSize));
        IOhandler.ReadBytes(buffer, IOHandler.RecvBufferSize);
      end
      else
        writeln('Message not received');
    end;

end;

当我运行这段代码时,我得到了recvBufferSize的一个值,但是缓冲区仍然是空的,然后我得到一个连接终止的消息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-24 19:33:41

RecvBufferSize与实际可用的数据数量无关。RecvBufferSize仅指定Indy在分配内部缓冲区从套接字读取原始数据时使用的大小。不管实际读取的是什么原始数据,都会放在IOHandler.InputBuffer中供ReadBytes()和其他IOHandler读取方法使用。

请使用以下代码:

代码语言:javascript
复制
with Client do
begin
  Host := '10.10.81.122';
  Port := 3490;

  try
    Connect;
    WriteLn('Connected!');

    if IOHandler.CheckForDataOnSource(1000) then
    begin
      WriteLn(Bytes available:' + IntToStr(IOHandler.InputBuffer.Size));
      IOHandler.ReadBytes(buffer, IOHandler.InputBuffer.Size);
    end else
      WriteLn('Message not received');
  except
    on E: Exception do
      WriteLn('Error! ' + E.Message);
  end;
end;

另一种选择是:

代码语言:javascript
复制
with Client do
begin
  Host := '10.10.81.122';
  Port := 3490;
  ReadTimeout := 1000;

  try
    Connect;
    WriteLn('Connected!');

    IOHandler.ReadBytes(buffer, -1);
    if Length(buffer) > 0 then
      WriteLn('Bytes read:' + IntToStr(Length(buffer)))
    else
      WriteLn('Message not received');
  except
    on E: Exception do
      WriteLn('Error! ' + E.Message);
  end;
end;

尽管如此,这并不能保证您实际上将收到完整的消息,因为这段代码只是读取读取时可用的任何原始数据。由于您的服务器在数据末尾发送一个中断行,所以可以使用ReadLn()而不是ReadBytes(),并让Indy等待直到实际收到中断:

代码语言:javascript
复制
with Client do
begin
  Host := '10.10.81.122';
  Port := 3490;
  ReadTimeout := 1000;

  try
    Connect;
    WriteLn('Connected!');
    Msg := IOHandler.ReadLn;
    if not IOHandler.ReadLnTimedOut then
      WriteLn('Message read:' + Msg)
    else
      WriteLn('Message not received');
  except
    on E: Exception do
      WriteLn('Error! ' + E.Message);
  end;
end;

另一种选择是:

代码语言:javascript
复制
with Client do
begin
  Host := '10.10.81.122';
  Port := 3490;

  try
    Connect;
    WriteLn('Connected!');

    Msg := IOHandler.ReadLn(LF, 1000);
    if not IOHandler.ReadLnTimedOut then
      WriteLn('Message read:' + Msg)
    else
      WriteLn('Message not received');
  except
    on E: Exception do
      WriteLn('Error! ' + E.Message);
  end;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23268783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档