SocketConnection(三层)怎么传送流文件 客户端与服务器端
我要客户端向服务器保存图片.....
请教高手!!!
另外能不能在 服务器端 在关闭时 向 客户端 发送消息.如:'服务器已经关闭,请退出!!'
谢谢~~~

解决方案 »

  1.   

    CSDN在高手呢??没有人帮我回答还是分太少了!!!!
      

  2.   

    unit FilePacketC;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
      ComObj, ActiveX, FPacketC_TLB, StdVcl,VBVariants;type
      TFilePacket = class(TAutoObject, IFilePacket)
      protected
        procedure ReadFilePacket(const FileName: WideString;
          var Packet: OleVariant); safecall;
        procedure ReadFilePacket2(const FileName: WideString;
          var Packet: OleVariant); safecall;
        procedure ReadFile(const FileName: WideString;
          var Packet: OleVariant); safecall;
        function WriteFileStream(var Stream: OleVariant;
          const FileName: WideString): SYSINT; safecall;
        function WriteFile(var Stream: OleVariant;
          const FileName: WideString): SYSINT; safecall;
        procedure ReadFile2(const FileName: WideString;
          var Packet: OleVariant); safecall;
        procedure PackStream(var Stream: OleVariant); safecall;
        procedure UnPackStream(var Stream: OleVariant); safecall;
        { Protected declarations }
      end;implementationuses ComServ,Zlib,Classes,SysUtils,Variants,windows;procedure TFilePacket.ReadFilePacket(const FileName: WideString;
                                         var Packet: OleVariant);
    var
      ZStream: TCompressionStream;
      TempStream:TFileStream;
      InStream:TMemoryStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      pj:Pointer;
      bSize:int64;
    begin
      InStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      TempStream:=TFileStream.Create(String(FileName),fmOpenRead);
      try
         ZStream:=TCompressionStream.Create(cldefault, InStream);
         try
            ZStream.CopyFrom(TempStream,0);
         finally
            ZStream.Free;
         end;
         Param:=VarArrayCreate([0,InStream.Size-1+sizeof(bSize)],varByte);
         p:=VarArrayLock(Param);
         try
            pj:=Addr(bSize);
            bSize:=TempStream.Size;
            BStream.Write(pj^,sizeof(bSize));
            BStream.Position:=sizeof(bSize);
            InStream.Position:=0;
            BStream.CopyFrom(InStream,InStream.Size);
            bstream.Position:=0;        BStream.Read(p^,BStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         InStream.Free;
         BStream.Free;
         TempStream.Free;
      end;
      if not DeleteFile(PChar(AnsiString(FileName))) then
      begin
         Sleep(1000);
         DeleteFile(PChar(AnsiString(FileName)));
      end;
      Packet:=Param;
    end;
    procedure TFilePacket.ReadFilePacket2(const FileName: WideString;
                                          var Packet: OleVariant);
    var
      ZStream: TCompressionStream;
      TempStream:TFileStream;
      InStream:TMemoryStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      pj:Pointer;
      bSize:int64;
    begin
      InStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      TempStream:=TFileStream.Create(String(FileName),fmOpenRead);
      try
         ZStream:=TCompressionStream.Create(cldefault, InStream);
         try
            ZStream.CopyFrom(TempStream,0);
         finally
            ZStream.Free;
         end;
         Param:=VarArrayCreate([0,InStream.Size-1+sizeof(bSize)],varByte);
         p:=VarArrayLock(Param);
         try
            pj:=Addr(bSize);
            bSize:=TempStream.Size;
            BStream.Write(pj^,sizeof(bSize));
            BStream.Position:=sizeof(bSize);
            InStream.Position:=0;
            BStream.CopyFrom(InStream,InStream.Size);
            bstream.Position:=0;        BStream.Read(p^,BStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         InStream.Free;
         BStream.Free;
         TempStream.Free;
      end;
      Packet:=Param;
    end;
    procedure TFilePacket.ReadFile2(const FileName: WideString;
                                    var Packet: OleVariant);
    var
      TempStream:TFileStream;
      Param:OleVariant;
      p:Pointer;
    begin
      TempStream:=TFileStream.Create(String(FileName),fmOpenRead);
      try
         Param:=VarArrayCreate([0,TempStream.Size-1],varByte);
         p:=VarArrayLock(Param);
         try
            TempStream.Position:=0;
            TempStream.Read(p^,TempStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         TempStream.Free;
      end;
      if not DeleteFile(PChar(AnsiString(FileName))) then
      begin
         Sleep(1000);
         DeleteFile(PChar(AnsiString(FileName)));
      end;
      Packet:=Param;
    end;
    procedure TFilePacket.ReadFile(const FileName: WideString;
                                   var Packet: OleVariant);
    var
      TempStream:TFileStream;
      Param:OleVariant;
      p:Pointer;
    begin
      TempStream:=TFileStream.Create(String(FileName),fmOpenRead);
      try
         Param:=VarArrayCreate([0,TempStream.Size-1],varByte);
         p:=VarArrayLock(Param);
         try
            TempStream.Position:=0;
            TempStream.Read(p^,TempStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         TempStream.Free;
      end;
      Packet:=Param;
    end;
      

  3.   

    function TFilePacket.WriteFileStream(var Stream: OleVariant;
                                         const FileName: WideString): SYSINT;
    var
      TempStream:TMemoryStream;
      OutStream:TFileStream;
      ZStream: TDecompressionStream;
      BStream:TMemoryStream;
      p:Pointer;
      bSize:int64;
      pj:Pointer;
    begin
      Result:=-1;
      TempStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      p:=VarArrayLock(Stream);
      try
         TempStream.Write(p^,VarArrayHighBound(Stream,1)+1);
         OutStream:=TFileStream.Create(String(FileName),fmCreate);
         pj:=Addr(bSize);
         TempStream.Position:=0;
         TempStream.Read(pj^,sizeof(bSize));
         TempStream.Position:=sizeof(bSize);
         if TempStream.Size >0 then BStream.CopyFrom(TempStream,TempStream.Size-sizeof(bSize));
         BStream.Position:=0;
         ZStream:=TDecompressionStream.Create(BStream);
         zstream.Position:=0;
         try
            if bSize>0 then OutStream.CopyFrom(ZStream,bSize);
         finally
            ZStream.Free;
            OutStream.Free;
         end;
      finally
         VarArrayUnlock(Stream);
         BStream.Free;
         TempStream.Free;
      end;
      Result:=0;
    end;
    function TFilePacket.WriteFile(var Stream: OleVariant;
                                   const FileName: WideString): SYSINT;
    var
      OutStream:TFileStream;
      p:Pointer;
    begin
      Result:=-1;
      p:=VarArrayLock(Stream);
      OutStream:=TFileStream.Create(String(FileName),fmCreate);
      try
         OutStream.Write(p^,VarArrayHighBound(Stream,1)+1);
      finally
         VarArrayUnlock(Stream);
         OutStream.Free;
      end;
      Result:=0;
    end;
    procedure TFilePacket.PackStream(var Stream: OleVariant);
    var
      ZStream: TCompressionStream;
      InStream:TMemoryStream;
      TempStream:TMemoryStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      pi:Pointer;
      pj:Pointer;
      bSize:DWORD;
    begin
      InStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      TempStream:=TMemoryStream.Create;
      //pi:=VarArrayLock(Stream);
      try
         //TempStream.Write(pi^,VarArrayHighBound(Stream,1)+1);
         WriteVariant(Stream,TempStream);
         ZStream:=TCompressionStream.Create(cldefault, InStream);
         try
            ZStream.CopyFrom(TempStream,0);
         finally
            ZStream.Free;
         end;
         Param:=VarArrayCreate([0,InStream.Size-1+sizeof(bSize)],varByte);
         p:=VarArrayLock(Param);
         try
            pj:=Addr(bSize);
            bSize:=TempStream.Size;
            BStream.Write(pj^,sizeof(bSize));
            BStream.Position:=sizeof(bSize);
            InStream.Position:=0;
            BStream.CopyFrom(InStream,InStream.Size);
            bstream.Position:=0;
            BStream.Read(p^,BStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         //VarArrayUnlock(Stream);
         InStream.Free;
         TempStream.Free;
         BStream.Free;
      end;
      Stream:=Param;
    end;
    procedure TFilePacket.UnPackStream(var Stream: OleVariant);
    var
      TempStream:TMemoryStream;
      OutStream:TMemoryStream;
      ZStream: TDecompressionStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      po:Pointer;
      bSize:DWORD;
      pj:Pointer;
      Flag:TVarFlags;
    begin
      TempStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      OutStream:=TMemoryStream.Create;
      p:=VarArrayLock(Stream);
      try
         TempStream.Write(p^,VarArrayHighBound(Stream,1)+1);
         pj:=Addr(bSize);
         TempStream.Position:=0;
         TempStream.Read(pj^,sizeof(bSize));
         TempStream.Position:=sizeof(bSize);
         if TempStream.Size>0 then BStream.CopyFrom(TempStream,TempStream.Size-sizeof(bSize));
         BStream.Position:=0;
         ZStream:=TDecompressionStream.Create(BStream);
         zstream.Position:=0;
         try
            OutStream.CopyFrom(ZStream,bSize);
            {Param:=VarArrayCreate([0,OutStream.Size-1],varByte);
            po:=VarArrayLock(Param);
            try
               OutStream.Position:=0;
               OutStream.Read(po^,OutStream.Size);
            finally
               VarArrayUnlock(Param);
            end;}
            OutStream.Position:=0;
            Param:=ReadVariant(Flag,OutStream);
         finally
            ZStream.Free;
         end;
      finally
         VarArrayUnlock(Stream);
         BStream.Free;
         OutStream.Free;
         TempStream.Free;
      end;
      Stream:=Param;
    end;
    initialization
      TAutoObjectFactory.Create(ComServer, TFilePacket, CLASS_FilePacketC,
        ciMultiInstance, tmApartment);
    end.
      

  4.   

    上面是服务端的COM接口实现代码.客户端调用相应接口即可.
    比如可以使用本地的ReadFile读入文件内容到一个OleVariant的变量当中,然后调用服务端的WriteFile将OleVariant变量当中的文件内容写入到服务器端的文件当中.
    procedure ReadFile(const FileName: WideString;
                                   var Packet: OleVariant);
    var
      TempStream:TFileStream;
      Param:OleVariant;
      p:Pointer;
    begin
      TempStream:=TFileStream.Create(String(FileName),fmOpenRead);
      try
         Param:=VarArrayCreate([0,TempStream.Size-1],varByte);
         p:=VarArrayLock(Param);
         try
            TempStream.Position:=0;
            TempStream.Read(p^,TempStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         TempStream.Free;
      end;
      Packet:=Param;
    end;
      

  5.   

     unsigned 
    能不能把程序发到我邮箱??我调试你的程序出了一些错误........
    [email protected]
    谢谢了~~~
      

  6.   

    这些错误我不知道怎么改啊!!  
      [Error] frmFWQ.pas(830): Undeclared identifier: 'WriteVariant'
      [Error] frmFWQ.pas(831): Incompatible types: 'TCompressionLevel' and 'Integer'
      [Error] frmFWQ.pas(872): Undeclared identifier: 'TVarFlags'
      [Error] frmFWQ.pas(899): Undeclared identifier: 'ReadVariant'
      [Fatal Error] HST_Ser.dpr(14): Could not compile used unit 'frmFWQ.pas'