【问题标题】:Delphi 7 and Indy 9 writing data from TCPServerDelphi 7 和 Indy 9 从 TCPServer 写入数据
【发布时间】:2013-10-07 13:02:07
【问题描述】:

我有一个 Delphi 程序,它作为服务器接收数据并发送回小的确认包。我以前使用过这段代码(为简洁而编辑)

procedure TdmServer.OnExecuteTCPServer(AThread: TIdPeerThread);
var
  IncomingPacket : string;
  ResponsePacket : string;
begin
  IncomingPacket := AThread.Connection.Readln(#$03);

  if IncomingPacket <> '' then
  begin
    ResponsePacket := ProcessTelegram(IncomingPacket);

    AThread.Connection.writeln(ResponsePacket);
  end;

  AThread.Connection.Disconnect;
end;

这几乎可以正常工作,除了在发送时附加一个行尾 CRLF,这是客户端(不受我控制)不喜欢的。

所以我改成:

AThread.Connection.Write(ResponsePacket);

客户端什么也没收到。

然后我尝试了

AThread.Connection.WriteBuffer(ResponsePacket, length(ResponsePacket), true);

尝试让它立即写入,但它仍然没有发送。

我已经延迟,尝试打开缓冲区,刷新并再次关闭它(如帮助文件),但仍然没有任何乐趣,并且任何时候调用 FlushWriteBuffer 我都会得到一个 AV。

我被困住了。请问有没有人可以提供一些智慧之言?

【问题讨论】:

    标签: delphi delphi-7 indy-9


    【解决方案1】:

    ReadLn() 从它的 Result 中去掉终止符。您的ProcessTelegram() 是否对此负责?如果它需要终结器,则必须手动将其重新添加,例如:

    ProcessTelegram(IncomingPacket + #03)
    

    ResponsePacket 的格式是否符合客户的期望?如果客户端不期望终止 CRLF,则使用 Write() 而不是 WriteLn() 是正确的做法。

    如果你使用WriteBuffer(),你必须解引用一个String才能将正确的数据地址传递给WriteBuffer(),例如:

    WriteBuffer(ResponsePacket[1], Length(ResponsePacket), True)
    

    或者:

    WriteBuffer(PChar(ResponsePacket)^, Length(ResponsePacket), True)
    

    如果客户端仍然没有正确接收响应,那么要么您根本没有发送任何内容,要么您没有发送客户端期望的终止符。使用数据包嗅探器(例如 Wireshark)来查看客户端实际接收到的内容(如果有的话)。

    【讨论】:

    • 谢谢 Remi,我需要取消对字符串的引用。现在它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多