delphi udp文件传输

客户端:

unit UnitClient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
  IdAntiFreezeBase, IdAntiFreeze, Gauges;

type
  TFormClient = class(TForm)
    IdUDPClient1: TIdUDPClient;
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Gauge1: TGauge;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormClient: TFormClient;

implementation

{$R *.dfm}

procedure TFormClient.Button1Click(Sender: TObject);
Var  ReceivedString:String;
  Mem:TFileStream;
  p:Array[0..1023] of byte;
  Posi,Len:Integer;
begin
  if OpenDialog1.Execute then
  begin
    IdUDPClient1.Host:=Edit1.Text;
    IdUDPClient1.Active:=True;
    IdUDPClient1.Send('Send file:File Name:'+OpenDialog1.FileName);
    ReceivedString := IdUDPClient1.ReceiveString();
    if UpperCase(ReceivedString)='RECIVED FILE NAME OK!' then
    begin
      Mem:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
      try
        Posi:=0;
        IdUDPClient1.Send('Send File:File Length:'+IntToStr(Mem.Size));
        ReceivedString := IdUDPClient1.ReceiveString();
        if UpperCase(ReceivedString)='RECIVED FILE LENGTH OK!' then
        begin
          While Posi<Mem.Size do//一次只发1024个字节,字节数不能太多,不过应该还可以增加一些.
          begin
            Len:=1024;
            if Mem.Size-Posi<1024 then
              Len:=Mem.Size-Posi;
            Mem.Read(p,Len);
            IdUDPClient1.SendBuffer(P,Len);
            Inc(Posi,Len);
            Gauge1.Progress:=Round(Posi/Mem.Size*100);
            ReceivedString := IdUDPClient1.ReceiveString();
            if UpperCase(ReceivedString)<>'RECIVED FILE PACKAGE OK!' then
              Break;
            Application.ProcessMessages;
          end;
          IdUDPClient1.Send('Send File:File End!');
        end else
          ShowMessage('Send file cancel!');
      finally
        Mem.Free;
      end;
    end;
  end;
end;

end.

服务器端

unit UnitServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle,
  IdAntiFreezeBase, IdAntiFreeze, Gauges;

type
  TFormServer = class(TForm)
    IdUDPServer1: TIdUDPServer;
    SaveDialog1: TSaveDialog;
    Gauge1: TGauge;
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;ABinding: TIdSocketHandle);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FileName:String;
    FileSize:Integer;
    Mem:TFileStream;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormServer: TFormServer;

implementation

{$R *.dfm}

procedure TFormServer.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
Var Str:String;
begin
  AData.Seek(0,0);
  SetLength(Str,AData.Size);
  AData.Read(Str[1],AData.Size);
  if Pos('Send file:File Name:',Str)>0 then
  begin
    Delete(Str,1,Length('Send file:File Name:'));
    FileName:=Str;
    Str:='Recived File Name OK!';
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
  end else if Pos('Send File:File Length:',Str)>0 then
  begin
    Delete(Str,1,Length('Send File:File Length:'));
    FileSize:=StrToIntDef(Str,0);
    SaveDialog1.FileName:=FileName;
    if SaveDialog1.Execute then
    begin
      FileName:=SaveDialog1.FileName;
      if FileExists(FileName) then
        DeleteFile(FileName);
      if Mem<>nil then
      begin
        Mem.Free;
        Mem:=nil;
      end;
      if not FileExists(FileName) then
        Mem:=TFileStream.Create(FileName,fmOpenReadWrite or fmCreate)
      else
        Mem:=TFileStream.Create(FileName,fmOpenReadWrite);
      Str:='Recived File Length OK!';
      ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
    end else
    begin
      Str:='Recived File Length Cancel!';
      ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
    end;
  end else if Pos('Send File:File End!',Str)>0 then
  begin
    if Mem<>nil then
    begin
      Mem.Free;
      Mem:=nil;
      Str:='Recived File OK!';
      ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
    end;
    FileName:='';
    FileSize:=0;
  end
  else
  begin
    if Mem<>nil then
    begin
      Mem.Seek(0,2);
      AData.Seek(0,0);
      Mem.CopyFrom(AData,AData.Size);
      Gauge1.Progress:=Round(Mem.Size/FileSize*100);
      Str:='Recived File Package OK!';
      ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Str[1], Length(Str));
      Application.ProcessMessages;
    end;
  end;
end;

procedure TFormServer.FormCreate(Sender: TObject);
begin
  IdUDPServer1.Active:=True;
  FileName:='';
  FileSize:=0;
  Mem:=nil;
end;

procedure TFormServer.FormDestroy(Sender: TObject);
begin
  if Mem<>nil then
    Mem.Free;
end;

end.

 

 

 

 

procedure TGisMapForm.SetAllVidIconXY;
var i: Integer;
  X, Y: Integer;
begin
    for i := Low(VI) to High(VI) do
        if VI[i].Img.Visible then
        begin
            GetOffsetXY(VI[i].X, VI[i].Y, X, Y);
            VI[i].Img.Left := X;
            VI[i].Img.Top := Y;
            VI[i].Img.Repaint;
        end;
end;

procedure TGisMapForm.GetOffsetXY(X: Integer; Y: Integer; var OffSetX: integer; var OffSetY: Integer);
var
    ZM: Double; //缩放度
    VX, VY: Integer;
    OX, OY: Integer;
begin
    ZM := Map.Zoom;
    VX := Map.ViewX;
    VY := Map.ViewY;
    OX := Map.OffsetX;
    OY := Map.OffsetY;
    OffSetX := Round(X * ZM / 100 - VX + OX);
    OffSetY := Round(Y * ZM / 100 - VY + OY);
end;


procedure TGisMapForm.UnderGetOffsetXY(OffSetX: integer; OffSetY: Integer;var X: Integer;var  Y: Integer);
var
    ZM: Double; //缩放度
    VX, VY: Integer;
    OX, OY: Integer;
begin
    ZM := Map.Zoom;
    VX := Map.ViewX;
    VY := Map.ViewY;
    OX := Map.OffsetX;
    OY := Map.OffsetY;
    X:=Round((OffSetX+VX- OX)* 100 / ZM);
    Y:=Round((OffSetY+VY- OY)* 100 /ZM);
end;

转载于:https://www.cnblogs.com/MaxWoods/p/3822407.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Delphi中使用Winsock2传输大文件需要以下步骤: 1. 创建一个新的项目,引入Winsock2单元和其他所需的单元。 2. 建立一个TCP/IP连接,在服务器和客户端之间进行数据传输。可以使用TServerSocket和TClientSocket组件来实现这一步骤。 3. 对于服务器端,创建一个监听套接字,绑定到一个指定的IP地址和端口号上。 4. 对于客户端,创建一个套接字,连接到服务器端的IP地址和端口号。 5. 在服务器端,接受客户端的连接并创建一个新的套接字与客户端进行通信。 6. 在客户端,发送文件之前,先将文件分成多个较小的数据块。 7. 使用Winsock2套接字的Send和Recv方法来发送和接收数据。 8. 如果数据包的大小超过套接字缓冲区的大小,可以使用循环发送和接收大文件。 9. 在服务器端,接收到的数据块可以存储在一个缓冲区中,用于后续的处理。 10. 客户端可以在发送完最后一个数据块后,给服务器端发送一个信号,表示文件发送完成。 11. 服务器端在接收到文件发送完成的信号后,可以将接收到的数据块组合成完整的文件。 12. 关闭套接字和释放相关资源。 以上是使用Delphi和Winsock2传输大文件的大致步骤。在实际应用中,还需要处理异常情况,如网络中断、传输错误等。可以使用Try...Except块捕获异常并进行相应的处理。 ### 回答2: 在Delphi中使用Winsock2进行大文件传输可以通过以下步骤完成: 1. 建立服务器和客户端:在服务器端和客户端都创建一个Winsock2套接字,并设置相应的IP地址和端口号。服务器套接字用于监听连接请求,客户端套接字用于连接到服务器。 2. 文件拆分和重组:将要传输的大文件拆分成较小的数据包,例如每个数据包的大小为2KB或更小。可以使用TFileStream来读取和写入文件数据。在接收端,接收到的数据包需要按照正确的顺序重组成完整的文件。 3. 发送和接收数据:在发送端,将拆分的数据包通过客户端套接字发送给服务器,直到所有数据包都发送完成。在接收端,服务器接收到的每个数据包需要确认接收,以确保数据完整性。 4. 进度跟踪和错误处理:在发送和接收过程中,可以实时跟踪传输进度,以便提供用户友好的界面。同时,需要处理可能出现的错误,如网络中断、传输超时等,以保证传输的稳定性和可靠性。 5. 断开连接和释放资源:传输完成后,关闭服务器和客户端套接字,释放所使用的资源,确保程序执行的完整性。 总结:通过上述步骤,可以在Delphi中使用Winsock2进行大文件传输。这样可以实现文件的分割和重组,通过发送和接收数据包实现文件传输,同时可以处理进度跟踪和错误处理,保证传输的可靠性。最后,断开连接和释放资源以完成传输过程。 ### 回答3: Delphi是一种用于开发Windows平台应用程序的编程语言,而Winsock2是Windows操作系统的网络编程接口。Winsock2提供了一组功能强大的API,用于在网络上进行数据传输。 要在Delphi中使用Winsock2传输大文件,可以按照以下步骤进行操作: 1. 导入Winsock2单元:在Delphi项目中,需要导入Winsock2单元,以便使用其中的函数和数据类型。可以使用"uses Winsock2"语句。 2. 创建Socket:使用Winsock2提供的函数创建一个socket。可以使用socket函数来创建一个socket对象,并指定传输协议(如TCP或UDP)以及相关的选项。 3. 连接到服务器:如果要将文件传输到远程服务器,需要使用connect函数与服务器建立连接。需要提供服务器的IP地址和端口号。 4. 打开文件:使用Delphi提供的文件处理函数打开需要传输的大文件。可以使用TFileStream或TFile类来读取文件的数据。 5. 分块传输:由于大文件可能不适合一次传输,因此可以将文件分成多个较小的块进行传输。可以使用send函数将每个块的数据发送到服务器端。 6. 服务器端接收:在服务器端,可以使用Winsock2提供的函数接收发送文件块。可以使用recv函数从客户端接收数据,并将其保存到文件中。 7. 关闭连接和文件:传输完所有块后,可以使用closesocket函数关闭socket连接,并使用Delphi提供的文件处理函数关闭文件。 以上是使用Delphi和Winsock2传输大文件的基本步骤。实际应用中,还可以添加错误处理、进度跟踪和安全验证等功能,以确保文件传输的可靠性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值