请教:(socket)服务器端怎么把接收的流形成文件?谢谢!
客户端
procedure TForm1.Button1Click(Sender: TObject);
var
mystream: TMemoryStream;
filename:string; //ini 文件路径
begin
filename:=ExtractFilePath(paramstr(0))+'22.txt';
mystream := TMemoryStream.Create;
mystream.LoadFromFile(filename);
mystream.position := 0; //加上这句看看
ClientSocket1.Socket.SendStream(mystream);
while(isjudge) do
begin
mystream.free;
isjudge:=false;
end;
end;服务器端:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
mystream:TMemoryStream;
begin
//len:=Socket.ReceiveLength;
//Socket.ReceiveBuf(mystream, Len);
end;我这里怎么接收客户端发来的流
我想把接收的流再形成文件
这样的程序是怎么写?
谢谢!
客户端
procedure TForm1.Button1Click(Sender: TObject);
var
mystream: TMemoryStream;
filename:string; //ini 文件路径
begin
filename:=ExtractFilePath(paramstr(0))+'22.txt';
mystream := TMemoryStream.Create;
mystream.LoadFromFile(filename);
mystream.position := 0; //加上这句看看
ClientSocket1.Socket.SendStream(mystream);
while(isjudge) do
begin
mystream.free;
isjudge:=false;
end;
end;服务器端:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
mystream:TMemoryStream;
begin
//len:=Socket.ReceiveLength;
//Socket.ReceiveBuf(mystream, Len);
end;我这里怎么接收客户端发来的流
我想把接收的流再形成文件
这样的程序是怎么写?
谢谢!
Stream: TWinSocketStream;
begin
Stream := TWinSocketStream.Create(Socket, 2000);
Stream.WaitForData(3000);
Stream.Read(nRead, n);
Stream.SaveTofile('aaa');大概是这样
Stream := TWinSocketStream.Create(Socket, 2000);
2000 是什么意思?Stream.WaitForData(3000);3000 是什么意思?Stream.Read(nRead, n);
这句话是什么意思?
Stream.SaveTofile('aaa');谢谢!
然后把你的接收的流读进缓存区,
然后用文件流对象一块一块把内存里的数据写到文件中例如: aFileName := IdTCPClient1.ReadLn(#13#10, 100) ; //读取传输过来的文件名 if aFileName = '' then Exit; //如果已经存在这个文件,先删掉
if FileExists(ExtractFileDir(ParamStr(0)) + '\'+aFileName) then
begin
memo1.Lines.Add('本地目录存在'+aFileName+',删掉这个文件');
DeleteFile(ExtractFileDir(ParamStr(0)) + '\'+aFileName);
end; //读取传输过来的文件名 IdTCPClient1.WriteLn;
IdTCPClient1.ReadBuffer(aFileSize, 4); //读取文件大小
ProgressBar1.Max := aFileSize; //设置进度条的显示最大数字 //创建文件流
ftmpStream:= TFileStream.Create(ExtractFileDir(ParamStr(0)) +'\'+aFileName, fmCreate);
//用一个循环,不停读取数据流 然后利用文件流写入文件中
repeat
//确定本次循环读取的快数大小
if aFileSize - ftmpStream.Size > SizeOf(Buff) then
ReadCount := SizeOf(Buff)
else
ReadCount := aFileSize - ftmpStream.Size; IdTCPClient1.ReadBuffer(Buff, ReadCount); //将传来的数据流读入缓存区
ftmpStream.WriteBuffer(Buff, ReadCount); //将缓存区的数据写进文件中
memo1.Lines.Add('写入文件 '+inttostr(ReadCount)+'字节。。');
ProgressBar1.Position := ftmpStream.Size; //改变进度条的状态
Application.ProcessMessages;
until ftmpStream.Size >= aFileSize; memo1.Lines.Add('读取连接流中数据,写入创建的文件流对象ftmpStream中。。'); disconnect;
memo1.Lines.Add('断开本次连接');