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

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

问题描述:

我试图使用服务器和客户端套接字将图片从'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:\temp\picture.bmp', fmCreate or 

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

end; 

图片收到/创建的,但要么是腐败上是从来没有收到因为tfilestream.create方法创作的IE浏览器? 请帮助!我做错了什么?

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

另一方面,ReceiveLength()只报告套接字AT THAT MOMENT上有多少字节可用。这可能比发送的完整流少(同样,ReceiveText()可能因为它在内部使用ReceiveLength()而无法接收完整发送的字符串)。

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

转到http://www.deja.comhttp://forums.embarcadero.com搜索Borland/CodeGear/Embarcadero新闻组/论坛档案。我之前多次发布过示例代码。

+0

例如https://forums.embarcadero.com/message.jspa ?messageID = 234664和https://forums.embarcadero.com/message.jspa?messageID=255358 - jeroen – 2010-07-17 20:20:03

+0

感谢您的答案,我不知道更多的非套接字更好的非阻塞或阻塞?我仍然无法发送它可以指向除jeroen pluimers之外的其他示例,还是可以请修改我的代码以使其工作?你是什​​么意思通过sendstream一次又一次,不会从发送流开始我的意思是我无法找到像socket.sendstream中的data.position(我们可以设置为当前位置)的任何参数....请帮助! – 2010-07-18 12:27:13

+0

''它的返回值返回实际发送的字节数''sendstream返回发送了多少字节?是不是它只返回布尔值,即发送流后真/假? – 2010-07-18 17:15:06

我不知道什么是错,但我会尝试解决一个更简单的问题。你甚至可以转移一些简单的东西吗?看看你是否可以转移只包含“你好”的c:\ hello.txt,并让它以正确的顺序到达。检查流和结果文件应该更容易,以查看事情是否出现乱码。如果您在服务器上没有收到“Hello”,那么您知道这与数据的大小或复杂性无关。

+0

感谢您的答案,是的,我可以传输文本文件,jpeg的给我proplems请帮助! – 2010-07-18 12:28:42

+0

虽然我发送的文本文件很小 – 2010-07-18 17:24:14

+0

也许尝试一些大型的模式,所以你可以看到是否有任何差距,转位等... – 2010-07-18 20:36:25