給你一個(gè)最簡(jiǎn)單的方法:
創(chuàng)新互聯(lián)公司主營(yíng)和龍網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開(kāi)發(fā)公司,和龍h5微信小程序開(kāi)發(fā)搭建,和龍網(wǎng)站營(yíng)銷(xiāo)推廣歡迎和龍等地區(qū)企業(yè)咨詢
第一、根據(jù) 拿到WSDL文件。
第二、根據(jù)Axis的jar包,把WSDL文件生成客服端java代碼。(可以把java文件打成jar文件,便于管理。怎么生成java代碼,百度里都有說(shuō)明我就不寫(xiě)了。)
第三、在你工程里用AXIS的功能屬性,調(diào)用外部接口;給你一個(gè)格式模板:
MobileCodeWSLocator l=new MobileCodeWSLocator();//MobileCodeWSLocator是WSDL文件生成客服端java類(lèi);
MobileCodeWSSoap s=l.getMobileCodeWSSoap();();//MobileCodeWSSoap 是WSDL文件生成客服端java類(lèi)
String m=s.getMobileCodeInfo("13811534742", "");
如果你用Axis生成的java類(lèi),格式和上面一樣;自己參考一下就懂了。
你上面明顯的連接異常,第三方服務(wù)明顯沒(méi)有開(kāi),WEBSERVICE可以設(shè)置戶名、密碼,像行所有的WEBSERVICE都設(shè)置,安全考慮吧。
對(duì)于你這個(gè)需求,可以用當(dāng)前比較熱門(mén)的websocket來(lái)解決。
websocket可以實(shí)現(xiàn)服務(wù)端和客戶端全雙工通信,實(shí)時(shí)性非常好。
你可以自己搭建websocket服務(wù),也可以使用第三方的websocket推送框架,比如【GoEasy】。
【GoEasy】目前支持java、php、python等服務(wù)端語(yǔ)言,同時(shí)也支持小程序、vue、uniapp等前端技術(shù),使用起來(lái)還是非常方便的。
java調(diào)用wsdl的步驟如下,主要是使用第三方框架:
步驟如下:
1.下載AXIS2類(lèi)庫(kù),AXIS2是目前java調(diào)用webservice的一個(gè)主要方法(由于更新較頻繁,請(qǐng)自行g(shù)oogle該類(lèi)庫(kù)的網(wǎng)址)
2.由于是第三方webservice,直接引入AXIS2的包就可以用了,代碼如下:
import?java.rmi.RemoteException;
import?javax.xml.rpc.ParameterMode;
import?javax.xml.rpc.ServiceException;
import?org.apache.axis.client.Call;
import?org.apache.axis.client.Service;
import?org.apache.axis.encoding.XMLType;
public?class?webServiceTest?{
public?String?invokeRemoteFuc()?{
String?endpoint?=?"";
String?result?=?"no?result!";
Service?service?=?new?Service();
Call?call;
Object[]?object?=?new?Object[1];
object[0]?=?"Dear?I?miss?you";//Object是用來(lái)存儲(chǔ)方法的參數(shù)
try?{
call?=?(Call)?service.createCall();
call.setTargetEndpointAddress(endpoint);//?遠(yuǎn)程調(diào)用路徑
call.setOperationName("say");//?調(diào)用的方法名
//?設(shè)置參數(shù)名:
call.addParameter("str1",?//?參數(shù)名
XMLType.XSD_STRING,//?參數(shù)類(lèi)型:String
ParameterMode.IN);//?參數(shù)模式:'IN'?or?'OUT'
//?設(shè)置返回值類(lèi)型:
call.setReturnType(XMLType.XSD_STRING);//?返回值類(lèi)型:String?????????
result?=?(String)?call.invoke(object);//?遠(yuǎn)程調(diào)用
}?catch?(ServiceException?e)?{
e.printStackTrace();
}?catch?(RemoteException?e)?{
e.printStackTrace();
}
return?result;
}
public?static?void?main(String[]?args)?{
webServiceTest?t?=?new?webServiceTest();
String?result?=?t.invokeRemoteFuc();
System.out.println(result);
}
}
該方法的原理很簡(jiǎn)單,通過(guò)AXIS2封裝好的類(lèi)設(shè)置URL和參數(shù),直接調(diào)用就好了,我們要關(guān)注的就是設(shè)置URL,方法,還有方法的參數(shù),其他的copypaste好啦,很簡(jiǎn)單吧,再看看其他的方法,我勒個(gè)去了,害我瞎搞兩天。遲點(diǎn)上個(gè)源碼共大家參考!
private JaxWsProxyFactoryBean getProxyFactory(Class? clazz,String address){
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(clazz);
factory.setAddress(address);
return factory;
}
public void save(){
JaxWsProxyFactoryBean factory = getProxyFactory(ProgramVerWebService.class, PROGRAM_VER_WEB_SERVICE_ADDRESS);
ProgramVerWebService service = (ProgramVerWebService)factory.create();
String result = service.getEmpByAccount("abc");
System.out.println(result);
}
本地建立接口,如ProgramVerWebService,然后建立factory調(diào)用即可,這里用的是cxf
也可以用axis2通過(guò)解析wsdl文件來(lái)直接生成本地代碼,調(diào)用如下:
ProgramVerWebServiceImplServiceStub stub = new ProgramVerWebServiceImplServiceStub();
GetEmpByAccountE e = new GetEmpByAccountE();
GetEmpByAccount request = new GetEmpByAccount();
request.setArg0("abc");
e.setGetEmpByAccount(request);
String result = stub.getEmpByAccount(e).getGetEmpByAccountResponse().get_return();
System.out.println(result);
這個(gè)問(wèn)題問(wèn)的不是很專(zhuān)業(yè)!準(zhǔn)確的說(shuō),應(yīng)該是java如何開(kāi)發(fā)一個(gè)websocket協(xié)議的服務(wù)端程序與js前端對(duì)接!因?yàn)閖ava socket不是一種協(xié)議,他是tcp的實(shí)現(xiàn),而websocket則是一種協(xié)議(類(lèi)似與HTTP,但與其不完全相同).至于實(shí)現(xiàn)方式,在tomcat7中的自帶的javax打頭的jar包中,就有對(duì)于websocket的支持,如果你創(chuàng)建了一個(gè)web項(xiàng)目,并且引用了tomcat7的server runtime,那么你可以直接對(duì)一個(gè)編寫(xiě)好的類(lèi)進(jìn)行改造成一個(gè)websocket的服務(wù)端!
比如:
@ServerEndpoint("/wsdemo")//此處指定訪問(wèn)地址,記得端口為tomcat配置的端口,即?ws://localhost:8080/projectName/wsdemo
public?class?WsDemo{
@OnMessage//直接加注釋即可//其他的OnError等類(lèi)似的
public?void?OnMessage(xxxEvent?event){//單詞忘了....
event.getBaseRemote().sendText("");//向客戶端發(fā)送信息
}
}