如何从特定文件夹中将多个图像从客户端发送到服务器。我设法只发送一张图片! 我用过这段代码
客户端代码
fn := 'C:\Documents and Settings\admin\Desktop\11/65474.jpg';
fs := TFileStream.Create(fn, fmOpenRead);
Host := Edit1.Text;
idTCPClient1.Connect;
IdTCPClient1.IOHandler.Write(fs);
服务器代码
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
fs: TFileStream;
begin
fs := TFileStream.Create('C:\Documents and Settings\Admin\Desktop\pic\.png', fmCreate);
AContext.Connection.IOHandler.ReadStream(fs, -1, True);
end;
这个想法是从一个tcpserver.idTCPCLient plz帮助发送文件夹中的所有imges到客户端? 我很抱歉没有问题。
答案 0 :(得分:0)
您对TIdIOHandler.Write(TStream)
和TIdIOHandler.ReadStream()
的来电不匹配。
默认情况下,ReadStream()
期望在流数据之前发送流大小。当AByteCount
为-1且AReadUntilDisconnect
为False(默认参数值)时,ReadStream()
读取前4或8个字节(取决于TIdIOHandler.LargeStream
属性)以了解如何许多字节要读入TStream
。但是,您将AReadUntilDisconnect
设置为True,因此忽略AByteCount
,并且ReadStream()
将不会退出,直到客户端与服务器断开连接。如果您需要接收多个流(或者在第一个流之后的任何其他内容),则使用错误的功能。
默认情况下,AWriteByteCount
的{{1}}参数为False,因此不会发送流大小。当Write(TStream)
设置为True时,AWriteByteCount
会使用4或8个字节(取决于Write()
属性)发送流大小,然后再发送流内容。
因此,您告诉客户端不要发送流大小,并告诉服务器IGNORE流大小(对于您显示的示例是正常的,但对于您的预期目标不正常),但您也告诉服务器等待,直到客户端断开连接以指示流的结束,但客户端在发送流后没有断开连接。
尝试更像这样的东西:
TIdIOHandler.LargeStream
idTCPClient1.Host := Edit1.Text;
idTCPClient1.Connect;
...
for fn in TDirectory.GetFiles('C:/1/') do
begin
fs := TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite);
try
IdTCPClient1.IOHandler.WriteLn(ExtractFileName(fn));
IdTCPClient1.IOHandler.Write(fs, 0, True);
end;
fs.Free;
end;
end;
...
idTCPClient1.Disconnect;
当然,有一个非常简单的骨骼协议。更灵活的协议将使用命令/响应模型,因此客户端可以发送除文件传输之外的不同类型的命令,客户端可以在实际发送之前请求发送文件的权限,如果文件成功,服务器可以发送确认收到与否等等。