我现在要做一个OA系统,其中需要进行文件互传,我听说UDP在知道对方IP与端口后可以畅通无阻的通过两个不同的局域网或通过internet相连的两个不同的局域网!所以我打算用delphi中的idUDPClient下idUDPServer组件来做,可是发现用UDP的话,需要对文件进行分块,等到达对方后再重新组块,我不太清楚如何实现文件分块与文件组块。如果无法实现的话,那用TCP的话在知道对方的IP与端口(象QQ似的通过中间服务器来动态获得对方IP与端口)后是否可以实现在通过internet互联的两个不同局域网间的传输?
共两个问题:
1、用UDP传输,如何实现文件的分块与组块?
2、用TCP在获得对方IP与端口后能否实现 通过internet互联的两个不同局域网间互传大文件?

解决方案 »

  1.   

    to 海天子:你做过这方面的试验吗?
    那用TCP传输大文件时还用对文件进行分块吗??
      

  2.   

    文件分块可否用blockread来完成
    文件组合用blockwrite来完成
    不知道符合不符合你的要求。
      

  3.   

    先随便问问:做个ftp不可以嘛 ?
     还有你要是想要关于文件分割源代码的话:[email protected] ,记得给俺分呀!呵呵
      

  4.   

    procedure TSendfTr.Execute; //发送文件,线程执行方法
    var buff:array[1..3096] of char;//发送buff
      i,fk:int64;//分块数
      ileft:integer;//余数
      sR:string;
    begin
      inherited;
      fi.Position:=0;//开始处,文件流
      fk:=SendForm.fsize div sizeof(Buff);
      ileft:=SendForm.fsize mod sizeof(Buff);
      for i:=1 to fk do
      begin
        if Terminated   then
          break;
        
        FillChar(buff, SizeOf(buff), #0);
        fi.Read(buff,sizeof(Buff));
        SendUdp.SendBuffer(aHost,aport,buff,sizeof(buff));//发送一个包 sendudp 为 udpclient
        
        sRe:=SendUdp.ReceiveString;//等对方回复,同步
        if sRe='#83' then//接收方终止
        begin
          break;
        end;
      end;
      if (ileft<>0) then
      begin
        FillChar(buff, SizeOf(buff), #0);
        fi.Read(buff,ileft);
        SendUdp.SendBuffer(aHost,aport,buff,sizeof(buff));//发送一个包
        sRe:=SendUdp.ReceiveString;//等对方回复,同步
        
      end;
    end;
    是以程序是使用udp发文件的一部分,希望有所帮助。
      

  5.   

    to huhaojie(似水流年) :
    你的代码能发的再详细点吗?
      

  6.   

    其实思路就这样,把文件分块发送,因为使用udp,所以你自已的代码(发送方,接收方),要进行同步,及相关的网络传输异常处理等。
      

  7.   

    to huhaojie:思路我已经掌握了,关键就是不知道如何同步,如何分块,如何组块,这样的程序我在网上也找不到
      

  8.   

    TMemoryStream.CopyFrom()
    或TFileStream.CopyFrom()你可以在流的最后加上你的信息参数,到客户端时再根据这些信息合并
      

  9.   

    to huojiehai:
      能说的再详细点吗??
      或者有没有类似源代码??
      

  10.   

    我该怎么在流中加入一些我的参数信息???
    我又该如何从流中剔除我所加入的参数信息??比如流中现已有我要传输的4K信息了,可是我要把这是第几块,还是这是什么类型的信息这类参数也要传过去,应该如何把这些参数信息加入呢?到了对方后,又不能把参数信息也写进文件,所以要剔除参数,这个剔除又如何实现呢??还有idUDPClient这个组件有一个receivestring()这个方法,上面的代码如它来做同步如:
    》》    sRe:=SendUdp.ReceiveString;//等对方回复,同步我想知道ReciveString()所收到的信息是对方自动发回来的确认信息还是编程在让对方用send()发回来的信息呢?
    比如:
    client:  idUDPClient.Send('sfjslkf');
      str:=idUDPClient.ReciveString();Server:
      
      不调用Send()方法这种情况下Client的Recivestring()方法还能是到对方的反回值吗??
      

  11.   

    to:wangwpf (渝) 楼主:
       你好!你要的东西俺已经发过去了!希望你能用的上!