网上看到这个代码但是用这个怎样先传送文件名后在传送文件呢?
还有文件大的话多个客户端上这种方式传送的话有没有问题?客户端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.
还有文件大的话多个客户端上这种方式传送的话有没有问题?客户端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.
服务端怎样接受呢?
请指点。
谢谢。
接收的时候,可以先读取结构体,然后,再将文件取出来。计算机数据,socket通信,都是以字节为单位的。
记录类型转字节数组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;