我有一个类似的问题here,但它面向PHP方面。看起来PHP能够接收一个数据包并立即(在同一个会话中)发送和回复。 我的问题是Delphi能做到吗?据我所知,答案是一个很大的NO。我需要分两步完成(两个程序)。问题是当第一个程序结束时,会话可能会关闭。我可以在两个过程调用之间保持会话打开。
答案 0 :(得分:12)
我将为您提供PHP
和Delphi
的示例代码。我们将使用GET
请求方法,因为它更容易,如果您不需要发送太多数据就足够了。我将从PHP
脚本开始,因为它可以单独测试,没有Delphi
应用程序(我们将使用浏览器对其进行测试)。
<?php
$a=$_GET['a'];
$b=$_GET['b'];
echo intval($a)*intval($b);
?>
此脚本需要在URL(a和b)中编码发送的两个值,将值相乘并返回答案。假设您正在运行LAMP的计算机上播放,并且您调用了此脚本script.php
,如果您在浏览器上导航到此脚本:
http://localhost/script.php?a=2&b=3
你会在浏览器中看到这个:
6
要分解我们在浏览器中写的网址:我们要求服务器/script.php
中的网页localhost
,我们正在传递此查询字符串到脚本:a=2&b=3
。 URL中?
之后的内容是查询字符串; &
符号分隔两个单独的参数=值对:a=2
和b=3
。在PHP端,您使用$a=$_GET['a']
来获取参数a
的值。就这么简单!
现在我们知道PHP脚本已启动并运行,我们可以转到Delphi部分。这是一个使用可以想象的效率最低的方法将两个值相乘的例程:
function MultiplyTwoNumbers(a,b:Integer):Integer;
var url: string;
H: TIdHttp;
SS: TStringStream;
begin
// Prepare the URL
url := 'http://fisiere.sediu.ro/script.php?a=' + IntToStr(a) + '&b=' + IntToStr(b);
H := TIdHttp.Create(nil);
try
SS := TStringStream.Create;
try
H.Get(url, SS);
Result := StrToInt(SS.DataString);
finally SS.Free;
end;
finally H.Free;
end;
end;
我故意在那里留下了正确的工作网址,因此您可以实际测试我已知的工作脚本。
以下是你如何称呼这个例程:
procedure TForm8.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(MultiplyTwoNumbers(3,4)));
end;
Delphi app makes two calls, first to SendID then a second to GetDataBack
提示不起作用,因为您拨打电话时服务器上运行的内容(实际上是GET)GetDataBack
根本不知道某人(GET
再次调用)SendID
GET
来自HTTP服务器的数据时,我们可以使用查询字符串轻松发送一些信息。如果我们需要发送大量信息,我们会使用POST
请求。