gpt4 book ai didi

delphi - 从客户端向服务器发送图片时出现问题

转载 作者:行者123 更新时间:2023-12-03 12:01:39 26 4
gpt4 key购买 nike

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

和onclient上的服务器读取为:
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方法而从未接收到损坏或创建的图片?
请帮忙!我在做什么错?

最佳答案

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

另一方面,ReceiveLength()仅在那一刻报告套接字上有多少字节可用。这很可能小于发送的完整流(同样,ReceiveText()可能不会接收完整的发送字符串,因为它在内部使用了ReceiveLength())。

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

转到http://www.deja.comhttp://forums.embarcadero.com搜索Borland/CodeGear/Embarcadero新闻组/论坛文件。我已经多次发布示例代码。

关于delphi - 从客户端向服务器发送图片时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3272342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com