我有一个使用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'),服务器如何处理此事件?
答案 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而不是制作自己的不兼容协议。