LAJP系列教程-第二部分-HelloWorld

  • 内容
  • 评论
  • 相关

 

 

第二部分: 以编写一个HelloWorld的方式介绍LAJP的使用。

江湖人言”光说不练假把式,光练不说傻把式“,上文讲了LAJP的种种优点好处,但对于一门新语言或技术,程序员最关心如何快速的在实践中了解这项技术的特点,因此还是从千锤百炼也不变的HelloWorld入手。

LAJP有两种通信模式:消息队列和socket,针对windows和linux平台本节教程共分为三节: windows下的socket模式hello world,linux下的socket模式hello world,和linux下的消息队列hello world。

随着LAJP版本的更新,这篇文章的具体操作细节已失去意义,但基本思想没有大的变化,仍值得一读。新的的hello入门请阅读LAJP开发网站的帮助文档:http://code.google.com/p/lajp/w/list

diaoyf
2010.5

一、windows下的socket模式hello world

■ 安装之前

系统要求: windows,安装好Apache、PHP环境
Java JDK:1.5以上。

■ 安装配置

下载 lajp-socket_[version].zip ,解压:

1. lajp-socket_[version]                    //socket版

2.    |

3.    |–java

4.    |    |

5.    |    |–hello                     //Hello World示例程序

6.    |    |    |

7.    |    |    |–HelloClass.class

8.    |    |    +–HelloClass.java

9.    |    |

10.    |    |–lajp_[version].jar   //Java服务端主程序

11.    |    |–run.sh                      //运行脚本(Unix/Linux)

12.    |    +–run.bat                   //运行脚本(Windows)

13.    |

14.    +–php

15.        |

16.        +–php_java.php               //PHP脚本

解开后有两个子目录,将php目录中的php_java.php文件复制到Apache+php环境中的发布目录,备用。

■ 编写PHP文件

1.

2. <?php header("Content-Type:text/html;charset=utf-8"); ?>

3.

4. <?PHP

5. require_once("php_java.php");  //引用下载的php_java.php文件

6.

7. $name = "Ali";

8.

9. try

10. {

11. //调用Java的hello.HelloClass类中的hello方法

12. $ret = lajp_call("hello.HelloClass::hello", $name);

13. echo "{$ret}<br>";

14. }

15. catch (Exception $e)

16. {

17. echo "Err:{$ret}<br>";

18. }

19. ?>

20.

■ 运行

1. 打开CMD黑窗口,CD进入解压目录的java子目录,运行其中的脚本程序run.bat,黑窗口中显示:

——————————————-
- Start LAJP-JAVA(socket)…
- time:Tue Sep 22 22:56:09 CST 2009
——————————————-
Listen port: 21230
set charser: UTF-8

以上信息表示Java服务已经运行。

2. 打开浏览器,访问刚创建的php程序地址,页面显示:”Hello World! Ali”。

OK,Hello World程序演示结束。

■ 解释

在下载的zip文件的Java程序中,带有一个LAJP服务,服务类是HelloClass.class,我们看它的源代码HelloClass.java:

1. package hello;

2. public class HelloClass

3. {

4. public static final String hello(String userName)

5. {

6. return "Hello World! " + userName;

7. }

8. }

当php程序执行到 $ret = lajp_call(”hello.HelloClass::hello”, $name)语句时,发生如下事情:

1. lajp_call函数参数”hello.HelloClass::hello”告诉LAJP,我要访问hello.HelloClass类中的hello方法,并且传给它一个参数$name。
2. 在lajp_call函数内部将请求包装为消息包,通过socket发送给Java服务
3. Java端的LAJP程序接收消息报,解析调用含义,找到HelloClass类和hello方法,执行方法调用,再将方法返回值包装为消息包,socket回PHP程序
4. PHP端lajp_call函数解析返回消息包,得到其中的字符串”Hello World! Ali”

二、Linux下的socket模式hello world

■ 安装之前

系统要求: Linux,安装好Apache、PHP环境
Java JDK:1.5以上。

■ 安装配置

下载 lajp-socket_[version].zip 或lajp-socket_[version].tar.gz ,解压:

1. lajp-socket_[version]                    //socket版

2.    |

3.    |–java

4.    |    |

5.    |    |–hello                     //Hello World示例程序

6.    |    |    |

7.    |    |    |–HelloClass.class

8.    |    |    +–HelloClass.java

9.    |    |

10.    |    |–lajp_[version].jar   //Java服务端主程序

11.    |    |–run.sh                      //运行脚本(Unix/Linux)

12.    |    +–run.bat                   //运行脚本(Windows)

13.    |

14.    +–php

15.        |

16.        +–php_java.php               //PHP脚本

解开后有两个子目录,将php目录中的php_java.php文件复制到Apache+php环境中的发布目录,备用。

■ 编写PHP文件

1.

2. <?php header("Content-Type:text/html;charset=utf-8"); ?>

3.

4. <?PHP

5. require_once("php_java.php");  //引用下载的php_java.php文件

6.

7. $name = "Ali";

8.

9. try

10. {

11. //调用Java的hello.HelloClass类中的hello方法

12. $ret = lajp_call("hello.HelloClass::hello", $name);

13. echo "{$ret}<br>";

14. }

15. catch (Exception $e)

16. {

17. echo "Err:{$ret}<br>";

18. }

19. ?>

20.

■ 运行

1. 运行脚本程序run.sh,显示:

——————————————-
- Start LAJP-JAVA(socket)…
- time:Tue Sep 22 22:56:09 CST 2009
——————————————-
Listen port: 21230
set charser: UTF-8

以上信息表示Java服务已经运行。

2. 打开浏览器,访问刚创建的php程序地址,页面显示:”Hello World! Ali”。

OK,Hello World程序演示结束。

■ 解释

和前面的Windows环境中的相同,不再详述。

三、Linux下的消息队列模式hello world

■ 安装之前

系统要求: Linux,安装好Apache、PHP环境
Java JDK:1.5以上。
gcc编译环境。

■ 安装配置

下载lajp_[version].tar.gz ,解压:

1. lajp_[version]                            //消息队列版

2.    |

3.    |–java

4.    |    |

5.    |    |–hello                     //Hello World示例程序

6.    |    |    |

7.    |    |    |–HelloClass.class

8.    |    |    +–HelloClass.java

9.    |    |

10.    |    |–lajp_[version].jar  //Java服务端主程序

11.    |    +–run.sh                    //运行脚本

12.    |

13.    |–jni                            //JNI源代码

14.    |   |

15.    |   |–lajp_MsgQ.c

16.    |   |–lajp_MsgQ.h

17.    |   +–make.sh

18.    | 

19.    +–php

20.        |

21.        +–php_java.php               //PHP脚本

■ 需要编译JNI

1. 进入java/jni目录

2. chmod +x make.sh //设置make.sh有执行权限

3. vi make.sh //编辑make.sh,按注释修改脚本:

1. #!/bin/sh

2. # ———————————————————–

3. #  LAJP-JNI 编译脚本 (2009-09 http://code.google.com/p/lajp/)

4. #

5. #  编译环境: Unix/Linux

6. #

7. #  源文件: lajp_MsgQ.c lajp_MsgQ.h

8. #  目标文件: liblajpmsgq.so

9. #  编译参数:

10. #        –share    : 编译为动态库

11. #        -I               : 搜索编译JNI需要的.h文件, 注意"/usr/lib/jvm/java-6-sun/"

12. #                         : 要换成编译环境中的JAVA_HOME路径

13. #

14. #  liblajpmsgq.so发布    : 复制到<java.library.path>中,可通过java程序:

15. #                                        : System.out.println(System.getProperties().getProperty("java.library.path"));

16. #                                        : 获得本机的<java.library.path>

17. # ———————————————————–

18.

19. gcc lajp_MsgQ.c –share -I. -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -o liblajpmsgq.so

修改19行的两处”/usr/lib/jvm/java-6-sun/”,替换为本机的JAVA_HOME路径。

4. ./make.sh //编译

5. 将编译出的动态库文件liblajpmsgq.so复制到/usr/lib目录。

JNI动态库.so需要复制到java.library.path路径中,此路径可通过Java程序System.out.println(System.getProperties().getProperty(”java.library.path”))得到。

编译JNI的详细步骤请看LAJP帮助文档

■ 编写PHP文件

1.

2. <?php header("Content-Type:text/html;charset=utf-8"); ?>

3.

4. <?PHP

5. require_once("php_java.php");  //引用下载的php_java.php文件

6.

7. $name = "Ali";

8.

9. try

10. {

11. //调用Java的hello.HelloClass类中的hello方法

12. $ret = lajp_call("hello.HelloClass::hello", $name);

13. echo "{$ret}<br>";

14. }

15. catch (Exception $e)

16. {

17. echo "Err:{$ret}<br>";

18. }

19. ?>

20.

■ 运行

1. 运行脚本程序run.sh,显示:

——————————————-
- Start LAJP-JAVA…
- time:Tue Sep 29 20:27:32 CST 2009
——————————————-
init [IPC] Message Queue OK…
init [IPC] Shared Memory OK…
init [IPC] Semaphore OK…
set charser: UTF-8
Start LAJP-JAVA OK…

以上信息表示Java服务已经运行。

2. 打开浏览器,访问刚创建的php程序地址,页面显示:”Hello World! Ali”。

OK,Hello World程序演示结束。

■ 解释

当php程序执行到 $ret = lajp_call(”hello.HelloClass::hello”, $name)语句时,发生如下事情:

1. lajp_call函数参数”hello.HelloClass::hello”告诉LAJP,我要访问hello.HelloClass类中的hello方法,并且传给它一个参数$name。
2. 在lajp_call函数内部将请求包装为消息包,写入系统消息队列
3. Java端的LAJP程序从消息队列中读取消息报,解析调用含义,找到HelloClass类和hello方法,执行方法调用,再将方法返回值包装为消息包,写入系统消息队列
4. PHP端lajp_call函数从消息队列中读取并解析返回消息包,得到其中的字符串”Hello World! Ali”


LAJP开源项目的网址:http://code.google.com/p/lajp/