| 
 
 
sjop全称是Sample Java ORB Protocol(简单Java对象请求代理协议)。相类似的协议有DCOM,CORBA,SOAP等等,相比之下sjop是一种极其简单并且高效的对象请求代理协议。 
  
sjop协议在minij2ee应用服务器中被实现,用于在php或其他非Java客户中调用minij2ee应用服务器中的EJB组件。 
  
sjop是基于文本的协议,这也正是他简单的原因。sjop通讯使用面向流的通讯协议,比如TCP/IP,通讯模式采用请求/应答模式。 
  
sjop定义了以下基本数据类型: 
java.lang.String:字符串 
java.lang.Short:短整型 
java.lang.Integer:整型 
java.lang.Long:长整型 
java.lang.Boolean:布尔值,“true”或者“false” 
java.lang.Float:浮点数 
java.lang.Double:双精度浮点数 
  
sjop定义以下特殊的数据类型: 
void:当调用的方法无返回值时,使用void。 
phpext.objref:Java对象的引用句柄,用于返回创建的Java对象,调用Java对象的方法调用或将Java对象作为参数。 
  
sjop的请求格式为: 
request:function 
request body 
EOR 
其中function是请求的功能,request body根据请求的功能不同而不同。EOR是请求体结束的标志。 
  
request body一般会包含一个参数列表parameter list,用于指定调用构造函数或方法的参数。parameter list由若干行参数条目组成,每个参数条目的格式如下: 
param:type:value 
例如: 
param:java.lang.String:abcd 
param:java.lang.Integer:1234 
由于每一个参数条目是一行,所以对于java.lang.String类型的参数,如果value里包含’ ’,则要进行编码。 
  
创建对象请求的格式为: 
request:new 
classname:name of java class 
parameter list 
EOR 
请求成功将在应答里返回一个phpext.objref类型的值,是创建的Java对象的引用句柄。 
  
删除对象请求的格式为: 
request:delete 
objref:object reference 
EOR 
请求成功,将在删除object reference指定的被代理的Java对象。object reference是创建对象请求返回的Java对象的引用句柄,或者是方法调用或静态方法调用返回的phpext.objref类型值。 
  
在minij2ee应用服务器的实现中,在一定时间内没有被引用的对象将被自动删除。 
  
方法调用请求的格式为: 
request:call 
objref: object reference 
methodname:name of method 
parameter list 
EOR 
请求返回方法调用的结果或异常。object reference是创建对象请求返回的Java对象的引用句柄,或者是方法调用或静态方法调用返回的phpext.objref类型值。 
  
静态方法调用的请求格式为: 
request:call 
classname:name of java class 
methodname:name of method 
parameter list 
EOR 
静态方法调用类似方法调用,只是将Java对象引用句柄改为了Java类名称,因为调用静态方法是不需要Java对象实例的。 
  
应答分成功和异常两种。 
成功应答格式为: 
responce:ok 
result:type:value 
type是返回值的类型,value是返回值。若请求没有返回值,则type为void,value为null。 
异常应答格式为: 
responce: error 
exception:type:value 
type是异常的类名称,如java.io.IOException,value是异常的描述。 
  
minij2ee应用服务器软件包中提供了minij2ee sjop实现的API,在phpsjop目录下,可以用于在CC++程序中方问minij2ee应用服务器上的EJB组件。 
  
sjop API提供了以下函数(宏): 
u       sjop_get_connection 
函数原型: 
HCOMM_CONNECTION sjop_get_connection(char* ip,char* port); 
描述: 
sjop_get_connection获取一条同minij2ee sjop服务器的连接,用于进行请求。ip是服务器的ip地址,port是服务器的端口号。一条连接可以用于多次请求。 
u       sjop_free_connection 
函数原型: 
void sjop_free_connection(HCOMM_CONNECTION hconn); 
描述: 
sjop_free_connection释放一条同minij2ee sjop服务器的连接。 
  
u       sjop_minij2ee_new_javaobj 
函数原型: 
PHPEXTRESPONCE* sjop_minij2ee_new_javaobj(HCOMM_CONNECTION conn,char* classname,...); 
描述: 
sjop_minij2ee_new_javaobj函数发送创建对象的请求。conn是同minij2ee sjop服务器的连接。函数返回一个PHPEXTRESPONCE结构指针包含了应答的内容。 
例子: 
PHPEXTRESPONCE* r= sjop_minij2ee_new_javaobj(hconn, “java.io.FileInputStream”, “java.lang.String”, “c:somefile” ); 
  
u       sjop_minij2ee_delete_javaobj 
函数原型: 
PHPEXTRESPONCE* sjop_minij2ee_delete_javaobj(HCOMM_CONNECTION conn,HJAVAOBJ jobj); 
描述: 
sjop_minij2ee_delete_javaobj 函数发送删除对象的请求。conn是同minij2ee sjop服务器的连接。函数返回一个PHPEXTRESPONCE结构指针包含了应答的内容。 
  
u       sjop_minij2ee_call_javaobj 
函数原型: 
PHPEXTRESPONCE* sjop_minij2ee_call_javaobj(HCOMM_CONNECTION conn,HJAVAOBJ jobj,char* methodname,...); 
描述: 
sjop_minij2ee_call_javaobj 函数发送方法调用的请求。conn是同minij2ee sjop服务器的连接。函数返回一个PHPEXTRESPONCE结构指针包含了应答的内容。 
例子: 
PHPEXTRESPONCE* r=sjop_minij2ee_call_javaobj(hconn, objref, “skip” , “java.lang.Long”, 16); 
  
u       sjop_minij2ee_callstatic_javaobj 
函数原型: 
PHPEXTRESPONCE* sjop_minij2ee_callstatic_javaobj(HCOMM_CONNECTION conn,char* classname,char* methodname,...); 
描述: 
sjop_minij2ee_callstatic_javaobj 函数发送静态方法调用的请求。conn是同minij2ee sjop服务器的连接。函数返回一个PHPEXTRESPONCE结构指针包含了应答的内容。 
例子: 
PHPEXTRESPONCE* r= sjop_minij2ee_callstatic_javaobj(hconn, “java.lang.System”, “getProperty”, “java.lang.String”, “java.version”); 
  
u       sjop_free_response 
函数原型: 
void sjop_free_responce(PHPEXTRESPONCE* resp); 
描述: 
sjop_free_response释放发送请求返回的PHPEXTRESPONCE结构指针。 
  
PHPEXTRESPONCE结构定义如下: 
typedef struct 
{ 
int succ;  //请求是否成功 
char* exptype;  //若异常,exptype指示了异常类的名称 
char* expvalue;  //若异常,expvalue指示了异常的描述 
char* resulttype;  //返回值类型,见数据类型 
union 
{ 
       int    int_value; 
       char*  string_value; 
       double double_value; 
       int    objref_value; 
}result;  //返回值的联合,根据返回值类型不同而使用不同的成员,加下表: 
 
| 
 返回值类型  | 
 对应的result中的成员  |  
| 
 java.lang.Short 
java.lang.Integer 
java.lang.Long 
java.lang.Boolean  | 
 int_value  |  
| 
 java.lang.String  | 
 string_value  |  
| 
 java.lang.Float 
java.lang.Double  | 
 double_value  |  
| 
 phpext.objref  | 
 objref_value  |  
| 
 void  | 
 无  |   
}PHPEXTRESPONCE; 
  
以下的宏可以用来访问PHPEXTRESPONCE结构指针: 
#define sjop_resp_ok(resp)             ((resp)->succ) 
#define sjop_resp_error(resp)           (!(resp)->succ) 
#define sjop_resp_exp_type(resp)        ((resp)->exptype) 
#define sjop_resp_exp_value(resp)       ((resp)->expvalue) 
#define sjop_resp_result_type(resp)      ((resp)->resulttype) 
#define sjop_resp_result_int(resp)        ((resp)->result.int_value) 
#define sjop_resp_result_string(resp)     ((resp)->result.string_value) 
#define sjop_resp_result_double(resp)    ((resp)->result.double_value) 
#define sjop_resp_result_javaobj(resp)    ((resp)->result.objref_value) 
 http://www.minij2ee.com/  
  
  |