java与wcf通信.docx
《java与wcf通信.docx》由会员分享,可在线阅读,更多相关《java与wcf通信.docx(33页珍藏版)》请在冰豆网上搜索。
![java与wcf通信.docx](https://file1.bdocx.com/fileroot1/2022-12/15/409f3834-9547-4bce-a07e-3f2262a0a172/409f3834-9547-4bce-a07e-3f2262a0a1721.gif)
java与wcf通信
java与wcf通信例子
java与wcf通信例子1
一.摘要1
二.环境说明2
三.编写wcf服务端和客户端2
3.1建立wcf环境2
3.2编写服务端3
3.3编写客户端7
四.用axis编写ws的服务端和客户端10
4.1.环境10
1.axis2下载地址10
4.2建立java的ws服务端13
4.3生成wsdl文件14
4.4生成aar服务文件17
4.5发布aar文件20
4.6通过wsdl生成java客户端代码22
4.7以客户端和ie访问服务28
五.java访问wcf服务端33
六.wcf访问java服务端36
七.遇到的问题36
一.摘要
本文讨论了wcf服务与客户端的通信,axis服务与客户端通信,java调用wcf服务,wcf访问java服务。
二.环境说明
微软环境:
iis5.1+2.0+vs2008+.netframework3.5,采用c#语言,vm虚拟机,操作系统xpsp3ip地址:
172.7.22.24。
java环境:
jdk1.6.0.21+tomcat6.0.29+axis2(1.6.0)+MyEclipse8.6.1。
操作系统xpsp3。
ip地址172.7.22.22。
三.编写wcf服务端和客户端
3.1建立wcf环境
1.建立一个空的解决方案,java_wcf_0100_helloworld,如图:
2.添加两个项目,Service(控制台应用程序),Client(控制台应用程序),项目结构如图:
说明:
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);
[OperationContract]
doubleSubtract(doublen1,doublen2);
[OperationContract]
doubleMultiply(doublen1,doublen2);
[OperationContract]
doubleDivide(doublen1,doublen2);
}
}
2.实现服务接口:
CalculatorService.cs代码如下:
usingSystem;
//添加命名空间引用
usingSystem.ServiceModel;
namespaceMicrosoft.ServiceModel.Samples
{
//实现服务contract
publicclassCalculatorService:
ICalculator
{
//实现服务方法
publicdoubleAdd(doublen1,doublen2)
{
doubleresult=n1+n2;
Console.WriteLine("接收到的加法参数:
({0},{1})",n1,n2);
//将结果输出到控制台
Console.WriteLine("计算结果:
{0}",result);
returnresult;
}
publicdoubleSubtract(doublen1,doublen2)
{
doubleresult=n1-n2;
Console.WriteLine("接收到的减法参数:
({0},{1})",n1,n2);
Console.WriteLine("计算结果:
{0}",result);
returnresult;
}
publicdoubleMultiply(doublen1,doublen2)
{
doubleresult=n1*n2;
Console.WriteLine("接收到的乘法参数:
({0},{1})",n1,n2);
Console.WriteLine("计算结果:
{0}",result);
returnresult;
}
publicdoubleDivide(doublen1,doublen2)
{
doubleresult=n1/n2;
Console.WriteLine("接收到的除法参数:
({0},{1})",n1,n2);
Console.WriteLine("计算结果:
{0}",result);
returnresult;
}
}
}
3.绑定服务:
Program.cs代码如下:
usingSystem;
usingSystem.ServiceModel;
usingSystem.ServiceModel.Description;
namespaceMicrosoft.ServiceModel.Samples
{
classProgram
{
staticvoidMain(string[]args)
{
//创建服务基地址
UribaseAddress=newUri("http:
//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.WriteLine("按回车键终止服务.");
Console.WriteLine();
Console.ReadLine();
selfHost.Close();
}
catch(CommunicationExceptionce)
{
Console.WriteLine("发生异常:
{0}",ce.Message);
selfHost.Abort();
}
}
}
}
到此wcf服务端编写完成,启动服务,在ie地址栏输入:
http:
//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项目中。
最后编写客户端调用代码:
Program.cs代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.ServiceModel;
namespaceClient
{
classClient
{
staticvoidMain()
{
//创建wcf客户端的endpoint
EndpointAddressepAddress=newEndpointAddress("http:
//172.7.22.24:
80/ServiceModelSamples/Service/CalculatorService");
CalculatorClientclient=newCalculatorClient(newWSHttpBinding(),epAddress);
//调用服务方法
//调用加法
doublevalue1=100.00D;
doublevalue2=15.99D;
doubleresult=client.Add(value1,value2);
Console.WriteLine("加法({0},{1})={2}",value1,value2,result);
//调用减法
value1=145.00D;
value2=76.54D;
result=client.Subtract(value1,value2);
Console.WriteLine("减法({0},{1})={2}",value1,value2,result);
//调用乘法
value1=9.00D;
value2=81.25D;
result=client.Multiply(value1,value2);
Console.WriteLine("乘法({0},{1})={2}",value1,value2,result);
//调用除法
value1=22.00D;
value2=7.00D;
result=client.Divide(value1,value2);
Console.WriteLine("除法({0},{1})={2}",value1,value2,result);
//关闭客户端并清理资源
client.Close();
Console.WriteLine();
Console.WriteLine("按回车键退出");
Console.ReadLine();
}
}
}
启动客户端,在启动客户端之前请确认你的服务已经启动。
编译客户端(不要运行),然后在C:
\wcf\java_wcf_0100_helloworld\Client\bin\Debug目录下运行:
Client.exe。
看到如下界面就表示成功了:
服务端:
客户端:
到此C#访问wcf服务已经完成。
四.用axis编写ws的服务端和客户端
4.1.环境
1.axis2下载地址
http:
//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:
http:
//archive.apache.org/dist/ws/axis2/tools/1_4_1/
axis2-eclipse-codegen-wizard.zip:
http:
//archive.apache.org/dist/ws/axis2/tools/1_4_1/
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下加入:
找到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等。
访问地址:
http:
//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服务文件
New->other->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命令。
结果如下:
2.myclipse的Axis2_Codegen_Wizard
结果如下:
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("http:
//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("http:
//172.7.22.22:
8082/axis2/services/HelloService");//thedefaultimplementationshouldpointtotherightendpoint
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.*"%>
<%@pageimport="org.apache.axis2.client.ServiceClient"%>
<%@pageimport="com.hik.xie.HelloServiceStub.*"%>
<%@pageimport="com.hik.xie.HelloServiceStub.GetCount"%>
<%@pageimport="com.hik.xie.HelloServiceStub.SayHello"%>
<%@pageimport="com.hik.xie.HelloServiceStub.GetCountResponse"%>
<%@pageimport="com.hik.xie.HelloServiceStub.SayHelloResponse"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
">
MyJSP'index.jsp'startingpage
--
-->