Delphi 7和Indy 9从TCPServer写入数据

时间:2013-10-07 13:02:07

标签: delphi delphi-7 indy-9

我有一个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。

我被困住了。任何人都可以提供任何智慧的话语吗?

1 个答案:

答案 0 :(得分:1)

ReadLn()从结果中删除终结符。你的ProcessTelegram()是否属于那个?如果需要终结器,则必须手动将其添加回来,例如:

ProcessTelegram(IncomingPacket + #03)

ResponsePacket是否正确格式化了客户端期望的内容?如果客户端不期望终止CRLF,那么使用Write()代替WriteLn()是正确的做法。

如果您使用WriteBuffer(),则必须取消引用字符串才能将正确的数据地址传递给WriteBuffer(),例如:

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

或者:

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

如果客户端仍未正确接收响应,则表示您根本没有发送任何内容,或者您​​没有发送客户端期望的终结符。使用数据包嗅探器(如Wireshark)来查看客户端实际接收的内容(如果有的话)。