需要修改代码,实现网络文件的传输!在线等候!甲方(发送方):
procedure TForm2.Button2Click(Sender: TObject);
var
buff:array[1..255] of char;
fromf:file;
num:integer;
begin
assignfile(fromf,'e:\a.bmp');
reset(fromf,1);
repeat
blockread(fromf,buff,255,num);form2.ClientSocket1.Socket.SendBuf(buff,num);until num=0;closefile(fromf);
showmessage('finshed!');end;
乙方(接收方):
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buff:array[1..255] of char; num:integer;
begin form1.ServerSocket1.Socket.Receivebuf(buff,255);blockwrite(tof,buff,255,num);
end;
procedure TForm2.Button2Click(Sender: TObject);
var
buff:array[1..255] of char;
fromf:file;
num:integer;
begin
assignfile(fromf,'e:\a.bmp');
reset(fromf,1);
repeat
blockread(fromf,buff,255,num);form2.ClientSocket1.Socket.SendBuf(buff,num);until num=0;closefile(fromf);
showmessage('finshed!');end;
乙方(接收方):
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buff:array[1..255] of char; num:integer;
begin form1.ServerSocket1.Socket.Receivebuf(buff,255);blockwrite(tof,buff,255,num);
end;
在onread事件中直接socket.receivebuf(...);
在网络上传输数据,很有可能出现A方发出的几批数据同时到达B方的情况.
可能情况如下,当然下面情况不是一定的,只是为了形象的说明问题
即A发送了4次256字节的数据,B方才收到数据,此时B方的OnRead事件被触发,此时的数据长度是4*256.
如果按照你的方法去接收数据,则有3帧数据被丢失.以下是解决方法,你参考一下,由于代码比较多,代码我就不写了,望见谅
1.定义一个TMemoryStream变量FReceiveBuf,用于保存Socket接收到的数据.
2.在Socket的OnRead事件中,处理FReceiveBuf保存的数据,流程分两种情况
(1) B方还未收满256字节的数据,则继续接收数据
(2) B方已收到数据>=256,则每次取256字节数据,并向后移动FReceiveBuf位置指针,直到FReceiveBuf所剩数据<256为止,记录下剩下的数据
(3) 等待下一个OnRead事件被触发.
1.首先是传收方握手,
2.传方取出传送的文件列表,依次取出文件大小,定义传送规刚(传送的大小,开始&结束标志),并且告之收方;
3.传送流文件通常采用阻塞式
4.取消连接