SocketConnection(三层)怎么传送流文件 客户端与服务器端 SocketConnection(三层)怎么传送流文件 客户端与服务器端我要客户端向服务器保存图片.....请教高手!!!另外能不能在 服务器端 在关闭时 向 客户端 发送消息.如:'服务器已经关闭,请退出!!'谢谢~~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CSDN在高手呢??没有人帮我回答还是分太少了!!!! 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; 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. 上面是服务端的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; unsigned 能不能把程序发到我邮箱??我调试你的程序出了一些错误........[email protected]谢谢了~~~ 这些错误我不知道怎么改啊!! [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' dbgrid组件数据显示问题 请问FastReport中怎样定义一个变量? 用Installsheild express做安装文件问题?怎样能打包成一个安装文件 请教 请教大家,如何实现局域网内通过摄像头实现实时的视频会话,延迟越小越好。 一个delphi下的报表控件,请大家测试,多多提出改进意见,谢谢. 本地存储的问题 关于服务器端与客户端数据传输问题 用canvas.copyrect()装入位图后,为什么马上就消失了?怎样让位图停留? 怎样使用自定义的光标??? 图像截取问题 求助delphi操作数据库的小问题
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;
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.
比如可以使用本地的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;
能不能把程序发到我邮箱??我调试你的程序出了一些错误........
[email protected]
谢谢了~~~
[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'