Delphi 使用TCP将文件从客户端发送到服务器,知道文件大小

Delphi 使用TCP将文件从客户端发送到服务器,知道文件大小,delphi,tcpclient,indy10,Delphi,Tcpclient,Indy10,你好,我正在尝试通过TCP和delphi发送一个文件,使用Indy组件和客户机/服务器 我设法正确地发送和接收文件,问题是在发送文件之前,我还想发送文件大小,以便在我将其发送到服务器后进行比较 现在我将文件从客户端发送到服务器 客户: Ms := TMemoryStream.Create; Ms.LoadFromFile('cliente.exe'); Ms.Position := 0; Result := True; Client.IOHandler.LargeStream

你好,我正在尝试通过TCP和delphi发送一个文件,使用Indy组件和客户机/服务器

我设法正确地发送和接收文件,问题是在发送文件之前,我还想发送文件大小,以便在我将其发送到服务器后进行比较

现在我将文件从客户端发送到服务器

客户:

Ms := TMemoryStream.Create;
  Ms.LoadFromFile('cliente.exe');
  Ms.Position := 0;

  Result := True;
  Client.IOHandler.LargeStream := True;
  try
    Client.IOHandler.Write(ms, 0, True);// (Ms, 0, true);
  except
    Result := False;
  end;
  Ms.Free;
服务器:

 AStream := TFileStream.Create('C:\temp\file.exe', fmCreate + fmShareDenyNone);
    try
      AContext.Connection.IOHandler.LargeStream := True;
      AContext.Connection.IOHandler.ReadStream(AStream, -1,false);
    finally
      FreeAndNil(AStream);
      Memo1.Lines.Add('File received');
    end;

因此,问题是如何将文件大小与文件一起发送?

您的代码已发送了文件大小。您正在将
Write(TStream)
AWriteByteCount
参数设置为True,这告诉它在发送流数据之前发送流大小。您告诉
ReadStream()
在读取流数据之前读取流大小。因此,Indy已经在退出
ReadStream()
之前为您验证了大小。您根本不需要手动操作。

使用
Client.IOHandler.Write(ms.Size)AContext.Connection.IOHandler.ReadInt64之前,执行code>在大量读取MemorystreamThx之前,我已经用
TCPClient.IOHandler.WriteLn(inttostr(Ms.Size))解决了这个问题
发送的大小:=stroint(AContext.Connection.Socket.ReadLn())我也这么想,但我试过了,但它不起作用。我试着在中场休息结束前把它剪断,它只是剪断了,一点错误都没有,这似乎很正常。这就是我为什么要手动操作的原因我向你保证,我所描述的在正确使用时效果很好。如果过早切断传输,接收器最终将出现套接字读取错误并引发异常。发送方可能会收到套接字错误,但这取决于操作系统出站缓冲区是否已满。请记住,操作系统和应用程序无法及时检测到异常断开连接,并且会乐于接受数据并对其进行缓冲,直到最终检测到断开连接。您必须使用心跳/保持活动来处理异常断开连接。至少,您应该启用TCP级别的keepalives,例如通过
TIdSocketHandle.SetKeepAliveValues()
。是的,您是对的,我不仅仅是在看Exception部分,而且做了太多,这就是为什么很难愚蠢的原因:)谢谢您的帮助