Delphi用TMS Sparkle编译Linux下简单Web服务器
在前几天的一篇文章中,我已经很详细的说明了如何为使用delphi编译linux程序来搭建编程环境,那今天我们就开始进行一个简单的实战吧。今天会使用到一个第三方的控件,TMS Sparkle,这个是一个第三方收费的控件TMSBIZ里的一个组件。
1、首先我们应该在Linux里面安装Apache,如果没有安装,我们直接在linux下输入这个安装命令就可以了。
sudo apt-get install apache2
安装完成后,我们在浏览器里输入linux的IP地址,比如我的是192.168.1.240,那我输入http://192.168.1.240回车后, 如果出现Apache的默认页面就表示安装成功了。如下图:
2、然后将PAServer打开并运行(这个可以详见上次的文章),然后在Delphi里新建一个Web Server Application工程,在弹出的窗体里我们现在Linux选项然后点下一步,接着我们再选"Apache Dynamic Link Module"继续下一步,这时候我们可以命名ApacheModule的名称,因为我这个是实际使用的名字,所以我键入了"sparkleserver_module"后就点完成按钮就OK了。在新建的项目的Target Platforms我们可以发现已经有了一个Linux64的目标平台,后面就是前面文章中我们设置的Linux SDK,并切换成默认。
这就是我们生成新项目并将Linux切换成默认后的项目的样式。
3、现在我们可以尝试编译下我们的程序,然后到linux用户根目录下的PAServer/Scratch-dir/一级一级目录进去,就可以发现你的.so程序已经安装的躺在里面了, 表示现在你的所有操作都是没有问题的。程序的功能我们过会儿在完成,现在我们先给我们的新的module程序在Apache下做个设置,以便后面我们可以随时调试程序使用。首先我们进入Apache的设置目录,然后新建两个配置文件,命令如下:
cd /etc/apache2/mods-available sudo touch sparkleserver.conf sudo touch sparkleserver.load
我们首先编辑我们的.load配置文件,一般我们都是使用vim,或者你也可以使用nano根据自己的喜好,就像我们在windows下你可以使用word也可以使用wps一样。
sudo vi sparkleserver.load
在.load配置文件里我们输入下面的内容,注意,第一,moudle名使用我们在第2步输入的那个module名,不能有错误;第二,我们这里的目录必须使用前面我们看到的.so文件的目录,不能有错,这里我这里根据我的环境大概写个示例,没有用真实的路径。第三,Linux下注意大小写一致。
LoadModule sparkleserver_module /home/henryxu/PAServer/scratch-dir/HenryXu/mod_SparkleServer/libmod_SparkleServer.so
保存退出后,我们再编辑我们的.conf配置文件,命令类似同上,在里面的输入如下的内容:
<Location /sparkle> SetHandler libmod_SparkleServer-handler </Location>
上面的内容第一行的sparkle就是一会儿在网址上输入的路径,第二个也就是你的生成的文件名再加"-handler",你可以参考你在delphi下的项目文件里的一段注释说明。
都完成后,我们就可以将我们建立的module生效并重新启动Apache服务,如果有错误,命令行中会有提示,你再一步一步的查看是哪一步出现了错误。
sudo a2enmod sparkleserver sudo apache2ctl stop sudo apache2ctl start
下面两个命令也可以使用
service apache2 restartser
4、最后,我们里浏览器里输入http://192.168.1.240/sparkle后,我们可以发现,现在已经出现了最最简单的文字了,这个文字就是我们Delphi程序中WebModule单元里的文字。
5、现在我们可以使用我们的Sparkle做服务程序了。我们在delphi程序中的新建项目里的webmodule文件的user块里加入sparkle的单元文件Sparkle.WebBroker.Server、Sparkle.WebBroker.Adapter、 Sparkle.HttpServer.Module和 Sparkle.HttpServer.Context, 然后加入一个全局变量:
var oSparkleServer: TWebBrokerServer;
接着在unit的最后加入初始化代码:
initialization oSparkleServer := TWebBrokerServer.Create; finalization oSparkleServer.Free; end.
然后再原有默认的WebModule1DefaultHandlerAction事件里修改如下的代码用来派发请求:
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var Adapter: IWebBrokerAdapter; begin Adapter := TWebBrokerAdapter.Create(Request, Response); oSparkleServer.DispatchRequest(Adapter); end;
最后我们在上一步的initialization初始化代码那里将Sparkle插入到ApacheModule里,现在你可以添加自己的代码,也可以添加Sparkle的web处理模块并将它们加u人到Dispatcher里面去。下面我做个简单的例子。
initialization oSparkleServer := TWebBrokerServer.Create; // add modules you want to use. This example assumes a simple Sparkle module, // but you can add your XData, RemoteDB or any other Sparkle module Server.Dispatcher.AddModule(TAnonymousServerModule.Create( 'http://localhost/tms/hello', procedure(const C: THttpServerContext) begin C.Response.StatusCode := 200; C.Response.ContentType := 'text/plain''; C.Response.Close(TEncoding.UTF8.GetBytes('Hello from Sparkle!')); end )); finalization oSparkleServer.Free; end.
现在我们重新编译新的代码并且发布到linux里面去,然后重新启动Apache2后,可以刷新原来的浏览器页面,可以发现上面的"Hello from Sparkle"已经出现了。于是你可以尽情的修改sparklewebmodule的内容了。。