java与wcf通信Word格式文档下载.docx
《java与wcf通信Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《java与wcf通信Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
说明:
client项目下的代码是通过svcutil.exe生成的,先不管,后面会讲。
3.2编写服务端
参考msdn上的wcf的例子编写,这个服务对外提供加,减,乘,除4种服务。
需要在项目->
右键->
添加引用->
.net下选择:
System.ServiceModal,在项目中会引用。
1.定义服务接口(Contact):
Icalculator.cs代码如下:
usingSystem;
//添加引用
usingSystem.ServiceModel;
namespaceMicrosoft.ServiceModel.Samples
{
//定义服务contrat
[ServiceContract(Namespace="
http:
//Microsoft.ServiceModel.Samples"
)]
publicinterfaceICalculator
{
//创建服务方法
[OperationContract]
doubleAdd(doublen1,doublen2);
doubleSubtract(doublen1,doublen2);
doubleMultiply(doublen1,doublen2);
doubleDivide(doublen1,doublen2);
}
}
2.实现服务接口:
CalculatorService.cs代码如下:
//添加命名空间引用
//实现服务contract
publicclassCalculatorService:
ICalculator
//实现服务方法
publicdoubleAdd(doublen1,doublen2)
doubleresult=n1+n2;
Console.WriteLine("
接收到的加法参数:
({0},{1})"
n1,n2);
//将结果输出到控制台
计算结果:
{0}"
result);
returnresult;
publicdoubleSubtract(doublen1,doublen2)
doubleresult=n1-n2;
接收到的减法参数:
publicdoubleMultiply(doublen1,doublen2)
doubleresult=n1*n2;
接收到的乘法参数:
publicdoubleDivide(doublen1,doublen2)
doubleresult=n1/n2;
接收到的除法参数:
3.绑定服务:
Program.cs代码如下:
usingSystem.ServiceModel.Description;
classProgram
staticvoidMain(string[]args)
//创建服务基地址
UribaseAddress=newUri("
//172.7.22.24:
80/ServiceModelSamples/Service"
);
//如果不是在同一台电脑上进行操作,请采用ip地址
//创建服务宿主
ServiceHostselfHost=newServiceHost(typeof(CalculatorService),baseAddress);
try
//添加服务endpoint
selfHost.AddServiceEndpoint(
typeof(ICalculator),
newWSHttpBinding(),//添加绑定,.net提供了12种绑定方式
"
CalculatorService"
//开启metadata交换
ServiceMetadataBehaviorsmb=newServiceMetadataBehavior();
smb.HttpGetEnabled=true;
selfHost.Description.Behaviors.Add(smb);
//开启服务,按任意键结束服务
selfHost.Open();
服务已经启动"
按回车键终止服务."
Console.WriteLine();
Console.ReadLine();
selfHost.Close();
catch(CommunicationExceptionce)
发生异常:
ce.Message);
selfHost.Abort();
到此wcf服务端编写完成,启动服务,在ie地址栏输入:
//localhost/ServiceModelSamples/Service看到如下界面:
表示服务以成功启用,查看其wsdl,这是wsHttpBinding的wsdl,在ie中输入:
3.3编写客户端
在Microsoftvisualstudio2008->
visualstudiotools->
visualstudio2008命令提示行下,跳转到生成代码存放的目录:
cdC:
\wcf\java_wcf_0100_helloworld\Client。
然后输入:
svcutil.exe/language:
cs/out:
generatedProxy.cs/config:
app.confighttp:
//172.7.22.24/ServiceModelSamples/service
之后将生成的2个导入到Client项目中。
最后编写客户端调用代码:
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceClient
classClient
staticvoidMain()
//创建wcf客户端的endpoint
EndpointAddressepAddress=newEndpointAddress("
80/ServiceModelSamples/Service/CalculatorService"
CalculatorClientclient=newCalculatorClient(newWSHttpBinding(),epAddress);
//调用服务方法
//调用加法
doublevalue1=100.00D;
doublevalue2=15.99D;
doubleresult=client.Add(value1,value2);
加法({0},{1})={2}"
value1,value2,result);
//调用减法
value1=145.00D;
value2=76.54D;
result=client.Subtract(value1,value2);
减法({0},{1})={2}"
//调用乘法
value1=9.00D;
value2=81.25D;
result=client.Multiply(value1,value2);
乘法({0},{1})={2}"
//调用除法
value1=22.00D;
value2=7.00D;
result=client.Divide(value1,value2);
除法({0},{1})={2}"
//关闭客户端并清理资源
client.Close();
按回车键退出"
启动客户端,在启动客户端之前请确认你的服务已经启动。
编译客户端(不要运行),然后在C:
\wcf\java_wcf_0100_helloworld\Client\bin\Debug目录下运行:
Client.exe。
看到如下界面就表示成功了:
服务端:
客户端:
到此C#访问wcf服务已经完成。
四.用axis编写ws的服务端和客户端
4.1.环境
1.axis2下载地址
//axis.apache.org/axis2/java/core/(我的版本1.6.0),这个版本没有backport-util-concurrent.jar包,版本是3.1,然而我在spring3.0.4里找到了这个包。
请下载axis2-1.6.0-bin.zip和axis2-1.6.0-war.zip,当然源码和文档也比较重要。
2.eclipse/myeclipse的插件下载地址:
axis2-eclipse-service-archiver-wizard.zip:
//archive.apache.org/dist/ws/axis2/tools/1_4_1/
axis2-eclipse-codegen-wizard.zip:
1)安装myclipse插件,将下载来的插件包解压,然后copy到\Genuitec\MyEclipse-8.6\dropins下:
2)然后修改Axis2_Codegen_Wizard_1.3.0为Axis2_Codegen_Wizard_1.4.0,同时修改plugin.xml如下:
版本改为:
1.4.0。
在runtime下加入:
<
library
name="
lib/geronimo-stax-api_1.0_spec-1.0.1.jar"
>
export
*"
/>
/library>
lib/backport-util-concurrent-3.1.jar"
找到backport-util-concurrent.jar(可以从网上下载,我是在spring3.0.4里找到的)和geronimo-stax-api_1.0_spec-1.0.1.jar(这是axis2.1.6.0lib下的包),将它们copy到Axis2_Codegen_Wizard_1.4.0的lib下。
3)在myeclipse里增加userliberary:
导入axis2(1.6.0)下lib的所有jar包,同时导入Axis2_Codegen_Wizard_1.4.0插件下的axis2-1.4.1.jar
4)将axis2-1.6.0-war.zip中war文件,发布到tomcat中,及把war文件copy到webapps目录下。
Axis2.war是一个webservice容器,同时它也支持多种web容器,如:
tomcat,jboss等。
访问地址:
//localhost:
8082/axis2/,如下:
注意:
图中的adminstration的登录用户和密码是:
admin和axis2。
当然这些都是可以修改的。
详细情况,请参考axis2的文档。
到此环境搭建完毕。
4.2建立java的ws服务端
首先,在myelipse中新建一个web工程java_wcf_conmmicate_helloworld,工程目录如下:
HelloWorld.java代码如下:
packagecom.hik.xie;
publicclassHelloWorld{
publicStringsayHello(Stringname){
returnname+"
say:
hellowcf_java"
;
publicintgetCount(intinput){
returninput+100;
够简单吧。
将这个web工程发布到tomcat中。
4.3生成wsdl文件
然后通过Axis2_Service_Archiver_1.3.0生成wsdl文件。
New->
other->
axis2codeGenerator
添加类所在的目录,输入类的全路径名,然后点击testclassloading
选择文件导出的路径,填写wsdl文件名称。
4.4生成aar服务文件
axis2servicearchiver
选择发布工程目录下的classess:
填写服务名称,和要加载的类的全路径名:
选择输出文件的路径,同时填写输出文件名称:
到此aar服务文件生成。
4.5发布aar文件
在axis2的容器发布刚才生成的aar文件。
查看服务是否成功
4.6通过wsdl生成java客户端代码
通过wsdl生成java客户端代码有3种方式:
1.axis2自带的wsdl2java
2.myclipse的Axis2_Codegen_Wizard
3.java自带的wsimport。
下面用3种方法生成java客户端代码:
1.axis2自带的wsdl2java,首先配置axis2的环境变量:
AXIS2_HOME和PATH,然后在cmd的任意目录使用wsdl2java命令。
结果如下:
3.java自带的wsimport
4.7以客户端和ie访问服务
用codegenerator生成的代码编写客户端。
1.以junit测试代码访问
1./**
2.*Autogeneratedtestmethod
3.*/
4.publicvoidtestgetCount()throwsjava.lang.Exception{
5.
6.com.hik.xie.HelloServiceStubstub=
7.newcom.hik.xie.HelloServiceStub("
//172.7.22.22:
8082/axis2/services/HelloService"
//thedefaultimplementationshouldpointtotherightendpoint
8.
9.com.hik.xie.HelloServiceStub.GetCountgetCount8=
10.(com.hik.xie.HelloServiceStub.GetCount)getTestObject(com.hik.xie.HelloServiceStub.GetCount.class);
11.getCount8.setInput(200);
12.assertNotNull(stub.getCount(getCount8));
13.GetCountResponsegcr=stub.getCount(getCount8);
14.System.out.println(gcr.get_return());
15.}
16.
17./**
18.*Autogeneratedtestmethod
19.*/
20.publicvoidtestsayHello()throwsjava.lang.Exception{
21.
22.com.hik.xie.HelloServiceStubstub=
23.newcom.hik.xie.HelloServiceStub("
24.
25.com.hik.xie.HelloServiceStub.SayHellosayHello10=
26.(com.hik.xie.HelloServiceStub.SayHello)getTestObject(com.hik.xie.HelloServiceStub.SayHello.class);
27.//TODO:
FillinthesayHello10here
28.
29.assertNotNull(stub.sayHello(
30.sayHello10));
31.sayHello10.setName("
centre"
32.SayHelloResponseresp=stub.sayHello(sayHello10);
33.System.out.println(resp.get_return());
34.
35.}
2.以jsp访问服务
Index.jsp代码如下:
%@pagelanguage="
java"
import="
java.util.*"
pageEncoding="
UTF-8"
%>
%@pageimport="
com.hik.xie.*"
org.apache.axis2.client.ServiceClient"
com.hik.xie.HelloServiceStub.*"
com.hik.xie.HelloServiceStub.GetCount"
com.hik.xie.HelloServiceStub.SayHello"
com.hik.xie.HelloServiceStub.GetCountResponse"
com.hik.xie.HelloServiceStub.SayHelloResponse"
%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"
:
//"
+request.getServerName()+"
+request.getServerPort()+path+"
/"
!
DOCTYPEHTMLPUBLIC"
-//W3C//DTDHTML4.01Transitional//EN"
html>
<
head>
<
basehref="
%=basePath%>
title>
MyJSP'
index.jsp'
startingpage<
/title>
metahttp-equiv="
pragma"
content="
no-cache"
cache-control"
expires"
0"
keywords"
keyword1,keyword2,keyword3"
description"
Thisismypage"
--
linkrel="
stylesheet"
type="
text/css"
href="
styles.css"
-->