如何使用tcp服务器客户端将文件夹中的所有图像发送到客户端?

时间:2014-12-11 09:56:25

标签: android image delphi tcp indy

如何从特定文件夹中将多个图像从客户端发送到服务器。我设法只发送一张图片! 我用过这段代码

客户端代码

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到客户端? 我很抱歉没有问题。

1 个答案:

答案 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;

当然,有一个非常简单的骨骼协议。更灵活的协议将使用命令/响应模型,因此客户端可以发送除文件传输之外的不同类型的命令,客户端可以在实际发送之前请求发送文件的权限,如果文件成功,服务器可以发送确认收到与否等等。