读书人

请问TWinSocketStream传送文件方法

发布时间: 2013-12-04 17:21:02 作者: rapoo

请教TWinSocketStream传送文件方法
网上看到这个代码但是用这个怎样先传送文件名后在传送文件呢?
还有文件大的话多个客户端上这种方式传送的话有没有问题?

客户端


procedure TForm1.Button1Click(Sender: TObject);
Var
s : TWinSocketStream;
f : TFileStream;
filename:string;
begin
ClientSocket1.Active:=true;
If Not OpenDialog1.Execute Then Exit;
ClientSocket1.Open;
s := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
f := TFileStream.Create(OpenDialog1.FileName, fmShareDenyWrite);
filename:=OpenDialog1.FileName;
Try
s.CopyFrom(f, 0);
Finally
s.Free;
f.Free;
ClientSocket1.Close;
End;
end;


服务端

Procedure TClientThread.ClientExecute;
Var
ReceiveBuffer : Array[0..4095] Of Char;
SocketStream : TWinSocketStream;
BytesRead : Integer;
F : TFileStream;
Begin
While Not Terminated And ClientSocket.Connected Do Begin
try
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
F := TFileStream.Create('c:\afile.exe', fmCreate); //这里应该是客户端传送的文件名才对
try
FillChar(ReceiveBuffer, 10, 0);
If SocketStream.WaitForData(5000) Then begin
Repeat
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead = 0 then
ClientSocket.Close
Else
F.WriteBuffer(ReceiveBuffer, BytesRead);
Until Not SocketStream.WaitForData(2000);
end;
finally
SocketStream.Free;
ClientSocket.Close;
f.Free;
end;
except
end;
End;
End;

procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
SocketThread := TClientThread.Create(False, ClientSocket);
end;

end.


[解决办法]
先建立一个Tmemorystrem,将一个结构体写入内存流,然后再将文件写入内存流,再发送。
接收的时候,可以先读取结构体,然后,再将文件取出来。计算机数据,socket通信,都是以字节为单位的。
[解决办法]
先转为字节数组,再用Stream.write(Buffer, count).
记录类型转字节数组

function RecordToByteArray(ARec: TRecordType): Bytes;//注:TRecordType是泛型表达
var
Src: PAnsiChar;
begin
Src:= PAnsiChar(@ARec);
SetLength(Result, SizeOf(TRecordType));
Move(ARec[0], Result[0], SizeOf(TRecordType));
end;

读书人网 >.NET

热点推荐