将图片从客户端发送到服务器的问题

我试图使用服务器和客户端套接字将'C: picture.bmp'中的图片发送到'c: temp picture.bmp' 客户端onconnect事件处理程序如下:
procedure TForm2.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
 var
  fs : tfilestream;
  begin
     fs := TFileStream.create('C:picture.bmp', fmOpenRead);//picture allready exists
     socket.SendStream(fs);
     fs.free;             
end;
和onclientread服务器:
procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  fmm : tfilestream;
  iLen: Integer;
    Bfr: Pointer;
  begin

     iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  fmm := TFileStream.Create('c:temppicture.bmp', fmCreate or 

fmShareDenyWrite);
  try
    Socket.ReceiveBuf(Bfr^, iLen);
    fmm.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr);
    fmm.Free;
  end;

end;
图片是收到/创建但是从来没有收到过腐败,即因为tfilestream.create方法创建的? 请帮忙!我做错了什么?     
已邀请:
尽管它的名称,SendStream()不保证发送整个流(特别是如果你使用非阻塞套接字)。它的返回值返回实际发送的字节数。如果在一次调用中发送的流量小于整个流量,则必须再次调用SendStream(),可能多次,以完成发送整个流(SendText()也存在相同的问题)。 另一方面,ReceiveLength()仅报告套接字上有多少字节可用。这可能小于发送的完整流(同样,ReceiveText()可能不会收到完整发送的字符串,因为它在内部使用ReceiveLength())。 发送流(或一般任意数据)的最佳方法是首先发送数据的大小,然后发送实际数据。继续调用SendBuf / Stream / Text()直到达到该大小(如果非阻塞套接字返回-1而不引发异常,则必须等待套接字的OnWrite事件在套接字再次接受更多数据之前触发)。在接收端,首先读取大小,然后继续读取,直到达到指定的大小。在获得所有数据之前,您可能必须多次触发OnRead事件。 访问http://www.deja.com和http://forums.embarcadero.com搜索Borland / CodeGear / Embarcadero新闻组/论坛档案。我以前多次发布过示例代码。     
我不知道什么是错的,但我会尝试解决一个更简单的问题。你甚至可以转移一些简单的东西吗?看看你是否可以传输只包含“Hello”的c: hello.txt并让它以正确的顺序到达。检查流和结果文件应该更容易,看看是否/哪里出现乱码。如果您在服务器上没有收到“Hello”,那么您知道它与数据的大小或复杂性无关。     

要回复问题请先登录注册