//接收端
procedure TClientThread.Execute;
var
  ReceiveBuffer: array[0..4095] of Char;
  SocketStream: TWinSocketStream;
  BytesRead: Integer;
begin
  Form1.ClientSocket1.Socket.ReceiveBuf(len, sizeof(len));
  SocketStream := TWinSocketStream.Create(Form1.ClientSocket1.Socket, 600000);
  F := TFileStream.Create('c:\abc1.pdf', fmCreate);
  f.Position := 0;
  try
    FillChar(ReceiveBuffer, 4096, 0);
    if SocketStream.WaitForData(5000) then
    begin
      repeat
        BytesRead := SocketStream.Read(ReceiveBuffer, SizeOf(ReceiveBuffer));
        if BytesRead <> 0 then
          F.WriteBuffer(ReceiveBuffer, BytesRead)
        else
          break;
        synchronize(finishedtime);
      until not SocketStream.WaitForData(20000);
    end;
  finally
    Form1.ClientSocket1.Close;
    SocketStream.Free;
    f.Free;
  end;
end;//发送端
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
  SocketThread := TClientThread.Create(true, ClientSocket);
  TClientThread(SocketThread).filename := edit1.Text;
  SocketThread.Resume;
end;procedure TClientThread.ClientExecute;
var
  SocketStream: TWinSocketStream;
  BytesRead: Integer;
  F: TFileStream;
begin
  try
    SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
    F := TFileStream.Create(ffilename, fmShareDenyWrite);
    SocketStream.Position := 0;
    f.Position := 0;
    try
      SocketStream.CopyFrom(f, 0);
    finally
      SocketStream.Free;
      ClientSocket.Close;
      f.Free;
    end;
  except
  end;
end;
现在的问题: 发送接收一切正常. 但为什么不管发什么文件/多大的文件,都少了开头的8个字节. 其余内容完全正常??  
试过十几K~十几M的文件都只有文件头没了8个字节.不解,望哪位大哥,帮帮小弟.

解决方案 »

  1.   

    发送端没看到你发送长度,而在接收端是先 Form1.ClientSocket1.Socket.ReceiveBuf(len, sizeof(len)); 接收了sizeof(len)的长度。
    那后面ReceiveBuf自然会少了这几个字节。
      

  2.   

    做发送和接收的一般采用
    文件长度
    文件内容
    这种方式来做.
    顺序接收,再savetofile就ok了
    少字节,应是有内容未收全.
      

  3.   


    发送的地方加个:ClientSocket.Socket.WriteBuf(len,sizeof(len));
      

  4.   

    多谢楼上的各位大哥啦
    一言惊醒梦中人,怎么就没想到 int64 就是8位的呢....  太粗心大意了昨天做的测试,忘记注释掉了. 想了一个晚上都不知道哪出了问题.