从客户端发送图片到服务器的问题
我试图使用服务器和客户端套接字将图片从'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.com和http://forums.embarcadero.com搜索Borland/CodeGear/Embarcadero新闻组/论坛档案。我之前多次发布过示例代码。
我不知道什么是错,但我会尝试解决一个更简单的问题。你甚至可以转移一些简单的东西吗?看看你是否可以转移只包含“你好”的c:\ hello.txt,并让它以正确的顺序到达。检查流和结果文件应该更容易,以查看事情是否出现乱码。如果您在服务器上没有收到“Hello”,那么您知道这与数据的大小或复杂性无关。
感谢您的答案,是的,我可以传输文本文件,jpeg的给我proplems请帮助! – 2010-07-18 12:28:42
虽然我发送的文本文件很小 – 2010-07-18 17:24:14
也许尝试一些大型的模式,所以你可以看到是否有任何差距,转位等... – 2010-07-18 20:36:25
例如https://forums.embarcadero.com/message.jspa ?messageID = 234664和https://forums.embarcadero.com/message.jspa?messageID=255358 - jeroen – 2010-07-17 20:20:03
感谢您的答案,我不知道更多的非套接字更好的非阻塞或阻塞?我仍然无法发送它可以指向除jeroen pluimers之外的其他示例,还是可以请修改我的代码以使其工作?你是什么意思通过sendstream一次又一次,不会从发送流开始我的意思是我无法找到像socket.sendstream中的data.position(我们可以设置为当前位置)的任何参数....请帮助! – 2010-07-18 12:27:13
''它的返回值返回实际发送的字节数''sendstream返回发送了多少字节?是不是它只返回布尔值,即发送流后真/假? – 2010-07-18 17:15:06