需要修改代码,实现网络文件的传输!在线等候!甲方(发送方):
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;

解决方案 »

  1.   

    form1.ServerSocket1.Socket.Receivebuf(buff,255);应该不可以吧
     
    在onread事件中直接socket.receivebuf(...);
      

  2.   

    文件的片大小要看网络环境,最好是动态的。因为,如果是1k的话,在局域网内速度会很慢,浪费资源。如果是太大,inet上会增大丢包和错误的可能性,导致反复重传。改进一下协议比较好。这个代码全吗?是否是省略了握手的那部分。
      

  3.   

    首先,你的代码有问题
    在网络上传输数据,很有可能出现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事件被触发.
      

  4.   

    补充一下:
    1.首先是传收方握手,
    2.传方取出传送的文件列表,依次取出文件大小,定义传送规刚(传送的大小,开始&结束标志),并且告之收方;
    3.传送流文件通常采用阻塞式
    4.取消连接
      

  5.   

    我正在做,我每次发送一个数据包都要求客户端发送一个响应包,以确定正确处理,我用的是WIN SOCKET,没有用控件,自己控制方便一点