如何实现局域网内机器之间的文件传输。有源码最好!200分相送!(200分)

  • 主题发起人 主题发起人 bluestar_sz
  • 开始时间 开始时间
B

bluestar_sz

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现局域网内机器之间的文件传输。有源码最好!200分相送!
 
delphi的demo有
旧资料里也有很多相关讨论
 
拼接的例子来了Client端:(发方)

private
stream : TMemoryStream; //定义内存流,其实用
文件流也可以
size,count : integer; //文件大小
end;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address := Edit1.Text;
ClientSocket1.Active := True;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Connected to '+Socket.RemoteAddress;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
stream := TMemoryStream.Create;
if OpenDialog1.Execute then
begin
stream.LoadFromFile(OpenDialog1.FileName);
size := stream.Size; //获得文件大小
count := 0;
ClientSocket1.Socket.SendText(inttostr(size)); //先发送大小
end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
rcvtxt : string;
buf : array [1..2048] of char;
left : integer;
begin
rcvtxt := Socket.ReceiveText;
left := size - count; //未读字节数
if AnsiPos('go',rcvtxt)=1 then //收到响应则发
begin
if sizeof(buf)<left then //若满一块则读一块
begin
stream.Read(buf,sizeof(buf));
Socket.SendBuf(buf,sizeof(buf));
count := count + sizeof(buf);
end
else //不满则发剩余的
begin
stream.Read(buf,left);
Socket.SendBuf(buf,left);
end;
end;
end;


Server端(收方)


private
Tof : file;
size,count :integer;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CutFirst(denstr: string;scrstr: string);
var
len :integer;
begin
len := length(scrstr);
denstr := copy(scrstr,2,(len-1));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active := True;
StatusBar1.SimpleText := 'Listening...';
end;

procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Connected from '+ Socket.RemoteAddress;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf : array [1..2048] of char;
rcvtxt : string;
left,len : integer;
begin
len := Socket.ReceiveLength;
if len<10 then //若长度小于10则认为是文件长度
begin
rcvtxt := Socket.ReceiveText;
size := strtoint(rcvtxt);
count := 0;
if SaveDialog1.Execute then
begin
AssignFile(ToF, SaveDialog1.FileName);
Rewrite(ToF, 1);
end;
Socket.SendText('go'); //响应一块
end
else
begin
left := size - count; //未写的字节数
if sizeof(buf)<left then //满一块则写一块
begin
Socket.ReceiveBuf(buf,sizeof(buf));
BlockWrite(Tof,buf,sizeof(buf));
count := count + sizeof(buf);
Socket.SendText('go');
end
else //否则写剩余字节数
begin
Socket.ReceiveBuf(buf,left);
BlockWrite(Tof,buf,left);
CloseFile(Tof);
end;
end;
end;

 
这个容易啊。。

用 SendBuf, 就可以了。。。

作一个简单的过程说明:
1、把要传送的文件信息先发送过去,,包括文件名,文件大小,,
2、用 TFileStream 或者是 TMemoryStream ,,把要传送的文件读入缓冲区,
当然如果要传的文件比较大的话,,是需要分段的。
fsTemp.Read(buf, sizeof(buf)); //
3、利用 Socket 的 Sendbuf 来发送,,
ClientSocket1.Socket.SendBuf(Buf,sizeof(buf));

发送端做的事,,基本上就是这样了,,

接收端(ServerSocket)的 OnClientRead 事件中
// 接收
Socket.ReceiveBuf(Buf,Sizeof(Buf));
// 把buf内的数据写入文件,,
fsTemp.Write(buf,sizeof(Buf)); // 当然还有接收数据的计数问题。。所以最好是先把文件尺寸传过去呢。。
基本的过程这样。。。

我有现成的代码,,但是效率不是很高,,
功能可以实现,过些再检查一下之后,共享。。

 
同意楼上
 
用Socket或UDP传输控件,将文件读到文件流FileStream 后用控件的SendStream方法
或者SendBuffer方法传输。在接收方用ReceiveBuffer接收到文件流,在从文件流写到
文件中就可以了。
 
多人接受答案了。
 
后退
顶部