SAP JCo的Server/Client编程实例
2011-09-23 10:40
459 查看
JCo是服务于SAP系统和Java系统的RFC中间件,是用Java实现的API,以Jar包的方式发布。应用灵活,但使用起来相对繁琐,NetWeaver Portal中基于Java的Webdynpro开发环境SAPNetWeaver Developer Studio就是通过JCo连接SAP的。通过一个简单实例,描述一下实现过程,开发环境:Eclipse + ECC,准备好JCo的Jar包。
一、SAP端:
SE37,创建一个RFC,供Java端调用
function zsap_calculate.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(NUMBER1) TYPE STRING
*" VALUE(NUMBER2) TYPE STRING
*" VALUE(OPERATOR) TYPE STRING
*" EXPORTING
*" VALUE(RESULT) TYPE STRING
*"----------------------------------------------------------------------
try .
case operator.
when '+'.
result = number1 + number2.
when '-'.
result = number1 - number2.
when '*'.
result = number1 * number2.
when '/'.
result = number1 / number2.
when others.
result = 'Not supported!'.
endcase.
catch cx_root.
result = 'Not supported!'.
endtry.
condense result.
endfunction.
SM59配置RFC destination
注意这里要设置为Unicode的communication type
SE37定义Java系统调用的接口函数:
SE38创建测试程序:
report zyincl_test_00 no standard page heading.
data:
l_number1 type string,
l_number2 type string,
l_operator type string,
l_result type string.
l_number1 = '15'.
l_number2 = '221'.
l_operator = '+'.
call function 'ZJ***A_CALCULATE' destination 'JCOPRO001'
exporting
number1 = l_number1
number2 = l_number2
operator = l_operator
importing
result = l_result.
write l_result.
二、Java端:
在Eclipse中创建一个Java Project
把JCo的Jar包配置到项目
创建服务类,处理SAP的请求,记得设置属性Unicode为1:
package org.clyde;
import com.sap.mw.jco.*;
import com.sap.mw.jco.JCO.Client;
import com.sap.mw.jco.JCO.Function;
import com.sap.mw.jco.JCO.ParameterList;
import com.sap.mw.jco.JCO.Repository;
import com.sap.mw.jco.JCO.Server;
public class Service extends Server {
private static Client client;
public Service(String gwhost, String gwserv, String progid, IRepository rep) {
super(gwhost, gwserv, progid, rep);
super.setProperty("unicode", "1");
if (client == null) {
client = JCO.createClient("550", "clyde", "1q2w3e4r", "EN",
"192.168.1.8", "00");
client.connect();
}
}
@Override
//重载方法,处理SAP对Java系统的远程访问
protected void handleRequest(Function function) throws Exception {
ParameterList input = function.getImportParameterList();
ParameterList output = function.getExportParameterList();
String number1, number2, operator, result;
number1 = input.getString("NUMBER1");
number2 = input.getString("NUMBER2");
operator = input.getString("OPERATOR");
if (function.getName().equals("ZJ***A_CALCULATE")) {
//调用SAP系统的RFC:ZSAP_CALCULATE实现计算
result = getResult(number1, number2, operator);
System.out.println("Calculating=> " + number1 + operator + number2
+ " = " + result);
output.setValue(result, "RESULT");
}
}
public String getResult(String number1, String number2, String operator) {
Repository rep = new Repository("", client);
Function func = rep.getFunctionTemplate("ZSAP_CALCULATE").getFunction();
ParameterList input = func.getImportParameterList();
input.setValue(number1, "NUMBER1");
input.setValue(number2, "NUMBER2");
input.setValue(operator, "OPERATOR");
func.setImportParameterList(input);
client.execute(func);
return func.getExportParameterList().getString("RESULT");
}
}
创建启动服务的Client类:
package org.clyde;
importcom.sap.mw.jco.JCO;
importcom.sap.mw.jco.JCO.Client;
importcom.sap.mw.jco.JCO.Repository;
public classJCoClient {
publicstatic void main(String[] args) {
Clientclient = JCO.createClient("550", "clyde","1q2w3e4r", "EN",
"192.168.1.8","00");
client.connect();
Repositoryrep = new JCO.Repository("", client);
//启动服务
newService("192.168.1.8", "sapgw00", "JCOPRO001",rep).start();
System.out.println("Serviceis started.");
}
}
运行JCoClient,启动服务:
回到SAP端,运行测试程序,成功返回结果:
修改参数,再测试几次,在Java端可以监控到请求的日志:
一、SAP端:
SE37,创建一个RFC,供Java端调用
function zsap_calculate.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(NUMBER1) TYPE STRING
*" VALUE(NUMBER2) TYPE STRING
*" VALUE(OPERATOR) TYPE STRING
*" EXPORTING
*" VALUE(RESULT) TYPE STRING
*"----------------------------------------------------------------------
try .
case operator.
when '+'.
result = number1 + number2.
when '-'.
result = number1 - number2.
when '*'.
result = number1 * number2.
when '/'.
result = number1 / number2.
when others.
result = 'Not supported!'.
endcase.
catch cx_root.
result = 'Not supported!'.
endtry.
condense result.
endfunction.
SM59配置RFC destination
注意这里要设置为Unicode的communication type
SE37定义Java系统调用的接口函数:
SE38创建测试程序:
report zyincl_test_00 no standard page heading.
data:
l_number1 type string,
l_number2 type string,
l_operator type string,
l_result type string.
l_number1 = '15'.
l_number2 = '221'.
l_operator = '+'.
call function 'ZJ***A_CALCULATE' destination 'JCOPRO001'
exporting
number1 = l_number1
number2 = l_number2
operator = l_operator
importing
result = l_result.
write l_result.
二、Java端:
在Eclipse中创建一个Java Project
把JCo的Jar包配置到项目
创建服务类,处理SAP的请求,记得设置属性Unicode为1:
package org.clyde;
import com.sap.mw.jco.*;
import com.sap.mw.jco.JCO.Client;
import com.sap.mw.jco.JCO.Function;
import com.sap.mw.jco.JCO.ParameterList;
import com.sap.mw.jco.JCO.Repository;
import com.sap.mw.jco.JCO.Server;
public class Service extends Server {
private static Client client;
public Service(String gwhost, String gwserv, String progid, IRepository rep) {
super(gwhost, gwserv, progid, rep);
super.setProperty("unicode", "1");
if (client == null) {
client = JCO.createClient("550", "clyde", "1q2w3e4r", "EN",
"192.168.1.8", "00");
client.connect();
}
}
@Override
//重载方法,处理SAP对Java系统的远程访问
protected void handleRequest(Function function) throws Exception {
ParameterList input = function.getImportParameterList();
ParameterList output = function.getExportParameterList();
String number1, number2, operator, result;
number1 = input.getString("NUMBER1");
number2 = input.getString("NUMBER2");
operator = input.getString("OPERATOR");
if (function.getName().equals("ZJ***A_CALCULATE")) {
//调用SAP系统的RFC:ZSAP_CALCULATE实现计算
result = getResult(number1, number2, operator);
System.out.println("Calculating=> " + number1 + operator + number2
+ " = " + result);
output.setValue(result, "RESULT");
}
}
public String getResult(String number1, String number2, String operator) {
Repository rep = new Repository("", client);
Function func = rep.getFunctionTemplate("ZSAP_CALCULATE").getFunction();
ParameterList input = func.getImportParameterList();
input.setValue(number1, "NUMBER1");
input.setValue(number2, "NUMBER2");
input.setValue(operator, "OPERATOR");
func.setImportParameterList(input);
client.execute(func);
return func.getExportParameterList().getString("RESULT");
}
}
创建启动服务的Client类:
package org.clyde;
importcom.sap.mw.jco.JCO;
importcom.sap.mw.jco.JCO.Client;
importcom.sap.mw.jco.JCO.Repository;
public classJCoClient {
publicstatic void main(String[] args) {
Clientclient = JCO.createClient("550", "clyde","1q2w3e4r", "EN",
"192.168.1.8","00");
client.connect();
Repositoryrep = new JCO.Repository("", client);
//启动服务
newService("192.168.1.8", "sapgw00", "JCOPRO001",rep).start();
System.out.println("Serviceis started.");
}
}
运行JCoClient,启动服务:
回到SAP端,运行测试程序,成功返回结果:
修改参数,再测试几次,在Java端可以监控到请求的日志:
相关文章推荐
- 套接字编程3 ------ 一个面向连接的SERVER/CLIENT综合实例
- SAP JCo的Server/Client编程实例
- 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client
- C++ Socket编程 基础一:简单的server 和client
- ServerSocket和ClientSocket控件通讯的实例
- 【2013】实习收获3:python网络编程--client端与server端入门(server)
- Java 在Client/Server 网络中的应用-Java基础-Java-编程开发
- Andoid - 开发实例(4):简易在线聊天实现 (Client+Server)
- Java网络编程之多线程Client-Server
- 3个学习Socket编程的简单例子:TCP Server/Client, Select
- 基于Linux的Socket编程之TCP全双工Server-Client聊天程序
- 【2013】实习收获2:python的网络编程--client端与server端入门(client端)
- client.c和server.c 网络套接字socket编程热身程序
- rsync配置实例 windows(rsync server) linux(rsync client)
- java BIO实例——ServerSocket、Socket编程
- TCP Socket编程实例1---Client端
- linux c socket client与server实例代码
- symbian client server 编程汇总
- python网络编程之TCP通信实例和socketserver框架使用例子
- python网络编程之TCP通信实例和socketserver框架使用例子