Delphi 将图片从客户端发送到服务器时出现问题

Delphi 将图片从客户端发送到服务器时出现问题,delphi,sockets,filestream,Delphi,Sockets,Filestream,我正在尝试使用服务器和客户端套接字将图片从“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',

我正在尝试使用服务器和客户端套接字将图片从“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;
和服务器的配置为:

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:\temp\picture.bmp', fmCreate or 

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

end;
图片已接收/创建,但在上损坏或从未接收,即由于tfilestream.create方法而创建?
请帮忙!我做错了什么?

我不知道出了什么问题,但我会尝试解决一个更简单的问题。i、 你能把一些简单的东西调过来吗?看看是否可以传输只包含“hello”的c:\hello.txt,并让它以正确的顺序到达。应该更容易检查流和生成的文件,以查看是否/在何处出现了混乱。如果您在服务器上没有收到“Hello”,那么您就知道这与数据的大小或复杂性无关。

尽管名称不同,SendStream()不保证发送整个流(特别是在使用非阻塞套接字的情况下)。它的返回值返回实际发送的字节数。如果在一次调用中发送的流小于完整大小,则必须再次调用SendStream(),可能需要多次才能完成整个流的发送(SendText()也存在同样的问题)

另一方面,ReceiveLength()只报告此时套接字上可用的字节数。这可能小于正在发送的完整流(同样,ReceiveText()也可能不会接收完整的已发送字符串,因为它在内部使用ReceiveLength()

发送流(或一般任意数据)的最佳方法是先发送数据的大小,然后再发送实际数据。继续调用SendBuf/Stream/Text(),直到达到该大小(如果非阻塞套接字在不引发异常的情况下返回-1,则必须等待套接字的OnWrite事件触发,然后套接字才能再次接受更多数据)。在接收端,首先读取大小,然后继续读取,直到达到指定的大小。在获取所有数据之前,您可能必须读入OnRead事件的多次触发


转到并搜索Borland/CodeGear/Embarcadero新闻组/论坛档案。我以前已经发布过很多次示例代码。

例如,jeroenthanks作为答案,我不太了解套接字,哪一个更好,是非阻塞还是阻塞?我仍然无法发送它。您可以指向jeroen pluimers之外的其他示例吗?或者您可以修改我的代码使其工作吗?一次又一次的发送流是什么意思?从一开始发送流不是吗?我的意思是我在socket.sendstream中找不到像data.position(可以设置为当前位置)这样的参数。。。。请救命其返回值返回实际发送的字节数“”sendstream是否返回已发送的字节数?发送数据流后,它是否只返回布尔值,即true/false?@omair:我对返回值的看法不好,SendStream()确实返回布尔值。但是,我所说的SendStream()不保证发送整个流仍然适用。一旦套接字报告任何错误,甚至WSAEWOULDBLOCK(如果您尝试使用非阻塞套接字发送大数据流,很可能会发生这种情况),它就会停止发送并退出。布尔返回值不是很有意义。只有在调用SendStream()时未连接套接字时,该值才为False。否则,它总是返回True,即使发生发送错误(在这种情况下,将触发OnError事件)。。。。。。SendStream()从流的当前位置开始发送。因此,您可以在循环中调用SendStream(),直到流位置达到流大小,SendStream()返回False,或者发生OnError事件,以先到者为准。感谢您的回答,是的,我可以传输文本文件,jpeg给了我一些问题,请帮助!虽然我发送的文本文件非常小,但可以尝试一些带有模式的大文件,这样您就可以看到是否有任何间隙、换位等。。。