JAVA与NET的相互调用TCPIP相互调用基本架构附原代文档格式.docx
- 文档编号:21013453
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:25
- 大小:329.54KB
JAVA与NET的相互调用TCPIP相互调用基本架构附原代文档格式.docx
《JAVA与NET的相互调用TCPIP相互调用基本架构附原代文档格式.docx》由会员分享,可在线阅读,更多相关《JAVA与NET的相互调用TCPIP相互调用基本架构附原代文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
Input>
4.<
Description>
获取Age等于此值的People对象集<
/Description>
//说明此契约内容
5.<
/Input>
6.<
Output>
7.<
Package>
Manager<
/Package>
//接收到GetPersonByAge请求时所调用的包名称
8.<
Class>
PersonManager<
/Class>
//接收到GetPersonByAge请求时所调用的类名称
9.<
Method>
GetListByAge<
/Method>
//接收到GetPersonByAge请求时所调用的处理方法名称
10.<
/Output>
11.<
/Contract>
12.<
GetPersonByID"
13.<
14.<
获取ID等于此值的People对象<
15.<
16.<
17.
<
Package
18.<
19.<
GetListByID<
20.<
21.<
22.<
/Contracts>
∙以JSON方式实现信息传送
尽管目前在C/S的开发当中大部分还是使用序列化对象和分节字段的方式进行双方通讯,但在这个实例当中,在下想以JSON通讯方式为例子来实现。
首先,客户端会使用额定格式的JSON向服务器发送请求:
{“ContractName”:
“GetPeopleByAge”,“Params”:
[23]}
ContractName代表着契约名称,系统会根据此名称在Contracts.xml文件中找到Name等于GetPeopleByAge的Contract项。
然后在对应Output的子项Package,Class,Method中查找到对应的包,类型和方法。
Params是客户端传输过来的参数,服务器端会调用对象的方法输入参数23后,得到计算结果,最后把结果返还到客户端。
在这里有两点是值得注意的,第一点是JSON中的契约格式是固定的,服务器与客户端都必须遵守此契约,在ContractName中输入是必须对应的契约名称,而在Params中输入的必输是一个参数的集合,哪怕里面只包含有一个参数。
第二点是在Contracts.xml文件,Output里面的Package,Class,Method是服务器端自定义的,它只是绑定了服务器端实现GetPersonByAge契约的方法,而这些方法并不是固定,服务器可以根据系统的需要而修改。
这个做法有点像Struts里面的Struts.xml文件,其意义就是要使服务器的处理方法与客户端发送的请求实现分离。
∙基本结构
系统的基本结构如图,客户端会以JSON方式{“ContractName”:
[23]}发送请求到服务器,服务器会利用“数据转换层”把接收到的请求转换成Contract对象。
然后逻辑转换层会根据该Contract对象调用对应的方法,最后把计算结果以JSON方式返回到客户端。
注意在服务器与客户端信息交换的过程中,都是使用JSON格式
∙JSON数据转换
在服务器端,当接到到客户端请求后,Transfer类负责把接收到的JSON数据转换成Contract对象。
在Transfer里面使用org.json工具包作为JSON的转化工具,org.json工具包可于以下网址下载http:
//www.json.org/java/index.html。
而Implement类包含GetResult(Contractcontract)方法,其作就是根据contract对象Package,Class,Method等属性,调用“逻辑转换层”的对应方法,最后把计算结果返还给InputControl。
服务器端接收请求后就会直接调用InputControl对输入的数据进行处理。
[java:
nogutter:
1.//Contract实体类,包含契约的package,class,method,params等多个属性
2.package
Model;
3.import
org.json.JSONArray;
4.public
class
{
5.private
String
package1;
6.private
class1;
7.private
method;
8.private
JSONArray
params;
9.public
void
setPackage1(String
package1)
10.this.package1
=
11.}
12.public
getPackage1()
13.return
14.}
15.public
setClass1(String
class1)
16.this.class1
17.}
18.public
getClass1()
19.return
20.}
21.public
setMethod(String
method)
22.this.method
23.}
24.public
getMethod()
25.return
26.}
27.public
setParams(JSONArray
params)
28.this.params
29.}
30.public
getParams()
31.return
32.}
33.}
34.//把输入的String字符串转化为Contract对象
35.//在这里使用org.json工具包作为JSON的转化工具,org.json工具包可于以下网址下载http:
//www.json.org/java/index.html
36.package
Common;
37.import
java.io.File;
38.import
java.io.IOException;
39.import
javax.xml.parsers.DocumentBuilder;
40.import
javax.xml.parsers.DocumentBuilderFactory;
41.import
javax.xml.parsers.ParserConfigurationException;
42.import
Model.Contract;
43.import
org.json.*;
44.import
org.w3c.dom.Document;
45.import
org.w3c.dom.Element;
46.import
org.w3c.dom.NodeList;
47.import
org.xml.sax.SAXException;
48.public
Transfer
49.private
Transfer(){}
50.private
static
contractName=null;
51.private
contract=new
Contract();
52.private
JSONObject
jsonObject=null;
53.public
GetContract(String
data)
throws
Exception,
JSONException,
ParserConfigurationException,
SAXException,
IOException{
54.jsonObject=new
JSONObject(data);
//把字符串转化为JSONOject对象
55.GetContractName();
//获取契约名称
56.GetProperty();
//获取契约的package,class,method属性
57.GetParams();
//获取契约的参数集
58.return
contract;
59.}
60./*
61.*
获取契约对应的包名称,类名称,方法名称
62.*/
63.private
GetProperty()
Exception{
64.File
file
new
File("
Contracts.xml"
);
65.DocumentBuilderFactory
factory
DocumentBuilderFactory.newInstance();
66.DocumentBuilder
builder
factory.newDocumentBuilder();
67.Document
doc
builder.parse(file);
68.NodeList
nodeList
doc.getElementsByTagName("
Contract"
69.Element
contractElement=null;
70.for
(int
i
0;
nodeList.getLength();
i++)
71.if(nodeList.item(i).getAttributes().item(0).getNodeValue().equals(contractName)){
72.contractElement=(Element)nodeList.item(i);
73.break;
74.}
75.}
76.if(contractElement!
=null){
77.Element
outputElement=(Element)contractElement.getElementsByTagName("
Output"
).item(0);
78.contract.setPackage1(outputElement.getElementsByTagName("
Package"
).item(0).getTextContent());
79.//获取包名称
80.contract.setClass1(outputElement.getElementsByTagName("
Class"
81.//获取类名称
82.contract.setMethod(outputElement.getElementsByTagName("
Method"
83.//获取方法名
84.}
85.else
86.throw
Exception("
未能找到对象的契约"
87.}
88./*
89.*
获取契约名称
90.*/
91.private
GetContractName()
JSONException{
92.contractName=jsonObject.getString("
ContractName"
93.}
94./*
95.*
获取输入参数
96.*/
97.private
GetParams()
98.contract.setParams(jsonObject.getJSONArray("
Params"
));
99.}
100.}
101.//调用Contract对象里面包中的类的某个方法,获取计算结果
102.package
103.import
java.lang.reflect.Method;
104.import
java.util.HashMap;
105.import
java.util.Map;
106.import
107.import
Model.*;
108.public
Implement
109.private
110.private
fullName;
111.private
Map<
String,Object>
objects=new
HashMap<
();
//保存对象实体
112.private
String,Class>
classes=new
//保存类名
113./*
114.*
先获取对应的对象,再用反射模式调用对象的方法,获取计算结果
115.*/
116.public
Object
GetResult(Contract
contract){
117.this.contract=contract;
118.this.fullName=contract.getPackage1()+"
."
+contract.getClass1();
119.try
120.Object
manager=GetObject();
121.Class
theClass=classes.get(fullName);
122.Method
method=theClass.getDeclaredMethod(contract.getMethod(),JSONArray.class);
123.return
method.invoke(manager,
contract.getParams());
124.}
catch
(Exception
e)
125.//
TODO
Auto-generated
block
126.e.printStackTrace();
127.return
null;
128.}
129.}
130./*
131.*
多次使用反射创建获取对象会损耗一定性能,所以此处使用单体模式获取对应的对象
132.*/
133.private
GetObject()
InstantiationException,
IllegalAccessException,
ClassNotFoundException{
134.if(!
objects.containsKey(fullName)){
135.Class
theClass
Class.forName(fullName);
136.classes.put(fullName,theClass);
137.Object
manager=theClass.newInstance();
138.objects.put(fullName,
manager);
139.}
140.return
objects.get(fullName);
141.}
142.}
143.//直接把接收到的二进制数据转换成String,然后通过Transfer把String转化为Contract对象,最后通过Implement获取运算结果
144.package
145.import
java.io.DataInputStream;
146.import
147.public
InputControl
148.private
DataInputStream
inputStream;
149.public
InputControl(DataInputStream
inputStream){
150.this.inputStream=inputStream;
151.}
152./*
153.*
直接把接收到的二进制数据转换成String,然后通过Transfer把String转化为Contract对象,最后通过Implement对象获取运算结果
154.*/
155.public
GetResult(){
156.byte[]
byteMessage=new
byte[1024];
//在此处只获取测试数据,在真正运行时应使用分批缓存的方式
157.try{
158.int
n=inputStream.read(byteMessage);
159.String
message=new
String(byteMessage,"
ASCII"
160.Contract
contract=Transfer.GetContract(message);
161.Implement
implement=new
Implement();
162.Object
result=implement.GetResult(contract);
163.return
result;
164.}
165.catch(Exception
ex){
166.ex.printStackTrace();
167.return
168.}
169.}
170.}
最后,系统通过OutputControl类把计算结果返还给客户端。
1.//把计算结果返回到客户端
java.io.Data
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA NET 相互 调用 TCPIP 基本 架构 附原代
![提示](https://static.bdocx.com/images/bang_tan.gif)