使用Indy命令处理程序从客户端读取图像数据

时间:2014-01-01 18:39:30

标签: delphi file-upload delphi-7 indy indy-9

我有一个使用Indy 9的小型客户端 - 服务器应用程序项目。我的服务器应用程序正在使用“命令处理程序”来处理客户端的命令。 在这种情况下,我的客户端应用程序使用 writeLn 过程发送命令和数据,这是基于文本的。例如:

IdTcpClient1.WriteLn('cmd1'+'#'+'hello server');

注意:'cmd1'是一个命令,'#'是命令分隔符,'hello server'是数据

为了处理这个命令(cmd1),我的服务器应用程序有一个如下过程:

procedure TForm1.IdTcpServer1cmd1Command(Asender:TIdCommand);
var
  s: string;
begin   
  if ( Assigned(ASender.Params) ) then
  begin
    s:= Asender.Param[0];
    ...............
    ...............
  end;
end;

到目前为止一切都很好。问题是我想添加一个功能,以便我的服务器应用程序能够从客户端请求和接收JPEG_image。如果客户端使用以下方法发送此图像: WriteStream 过程,例如:

IdTcpClient1.WriteStream(MyImageStream);

如果服务器没有特定的命令(例如本例中的'cmd1'),服务器如何处理此事件?

2 个答案:

答案 0 :(得分:1)

您只需在命令处理程序中调用ReadStream(),例如:

IdTcpClient1.WriteLn('JPEG');
IdTcpClient1.WriteStream(MyImageStream, True, True); // AWriteByteCount=True

procedure TForm1.IdTcpServer1JPEGCommand(ASender: TIdCommand);
var
  Strm: TMemoryStream;
begin   
  ...
  Strm := TMemoryStream.Create;
  try
    ASender.Thread.Connection.ReadStream(Strm); // expects AWriteByteCount=True by default
    ...
  finally
    Strm.Free;
  end;
  ...
end;

可替换地:

IdTcpClient1.WriteLn('JPEG#' + IntToStr(MyImageStream.Size));
IdTcpClient1.WriteStream(MyImageStream); // AWriteByteCount=False

procedure TForm1.IdTcpServer1JPEGCommand(ASender: TIdCommand);
var
  Size: Integer;
  Strm: TMemoryStream;
begin   
  ...
  Size := StrToInt(ASender.Params[0]);
  Strm := TMemoryStream.Create;
  try
    if Size > 0 then
      ASender.Thread.Connection.ReadStream(Strm, Size, False); // AWriteByteCount=True not expected
    ...
  finally
    Strm.Free;
  end;
  ...
end;

答案 1 :(得分:0)

  

服务器如何处理此事件

那你究竟想学什么? What is your actual question

  • 如果您想知道服务器的行为方式 - 那么只需运行您的程序,看看会发生什么。
  • 如果您想知道如何设计服务器和客户端,那么客户端可以将图片上传到服务器 - 然后问一下。

我认为正确的做法是添加带有两个参数的命令“picture-upload”:整数标记和jpeg流。

当服务器回复cmd1命令时,如果需要,它将生成并附加一个唯一的整数令牌,要求客户端上传屏幕截图。

当客户端收到此回复时,它会解析它,如果找到令牌 - 将再发出一个命令,一个专门设计的“图片上传#12345”(其中12345替换为实际令牌值),然后图片本身。然后,服务器将使用令牌值来了解哪个客户端以及上载的原因。

PS。虽然我个人认为你最好只使用标准化的HTTP REST而不是制作自己的不兼容协议。