zoukankan      html  css  js  c++  java
  • JAVA开发WEBSERVICE方式

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录。

    1.Axis2方式

    Axis是apache下一个开源的webservice开发组件,出现的算是比较早了,也比较成熟。这里主要介绍Axis+eclipse开发webservice,当然不用eclipse也可以开发和发布webservice,只是用eclipse会比较方便。

    (1)下载eclipse的Java EE版本

    http://www.eclipse.org/downloads/

    (2)下载axis2

    http://axis.apache.org/axis2/java/core/download.cgi

    (3)下载eclipse的axis2插件

    Axis2_Codegen_Wizard

    Axis2_Service_Archiver

    http://axis.apache.org/axis2/java/core/tools/index.html

    推荐使用1.3的版本

    (4)eclipse安装axis2插件

    1)在任意目录下新建一个Axis2文件夹,在该文件夹下新建eclipse目录,在eclipse目录中新建plugins目录和features目录,例如:D:programSoftwareeclipse-SVNAxis2eclipse;

    2)把下载的axis2插件解压,并把解压的文件放到新建的eclipse的plugins目录下;

    3)在%eclipse_home%的目录下新建links目录,并在links目录下新建axis2.link文件,内容为:path=D:programSoftwareeclipse-SVNAxis2;

    4)重启eclipse,点击·file-new-other,如果看到Axis2 Wizards,则表明插件安装成功。

    (5)安装axis2

    下载Axis2的WAR Distribution并解压,把axis2.war包放置到%TOMCAT_HOME%/webapps下,启动tomcat,访问http://localhost:port/axis2,Axis2安装成功。

    (6)使用eclipse新建web工程,创建一个普通java类,至少包含一个方法。

    (7)发布webservice

    1)点击eclipse的File-New-other,打开Axis2 Wizards,选择Axis2 Service Archiver,然后Next;

    2)选择Class File Location,也就是类文件存放路径,注意:只选到classes目录,不要包括包文件夹,然后Next;

    3)选择Skip WSDL,然后Next

    4)一路Next到Select the Service XML file to be included in the Service archive,勾选Generate theservice xml automatically;

    5)Service Name-填写你的service名称,Class Name-填写类名称,要包括包名,然后点击load,然后点击Finish,这时webservice就发布成功了;

    6)然后到%TOMCAT_HOME%/webapps/axis2/WEB-INF/services 看看是否多了一个.aar的文件;

    7)访问http://localhost:8085/axis2/services/类名?wsdl 就可看到生成的wsdl文件了。

    注意:以上的方式是发布到axis2.war包中,你也可以把生成.aar文件copy到你的实际应用中,同时,你也可以使用eclipse的create webservice功能发布你的webservice,选择axis2生成你的webservice,这样webservice就会部署到你的应用中了。

    2.Apche CXF方式

    CXF开发webservice也是比较方便和简单的,它和spring的集成可以说是非常地好。举一个CXF开发webservice的例子吧。

    1)在eclipse中新建一个web工程,导入依赖包,如图:

    2)编写一个接口,如:

    public String test(@WebParam(name="value", targetNamespace = "http://service.cxf.zcl.com/", mode = WebParam.Mode.IN)String value);

    注意:CXF开发的webservice,接口中的方法的参数一定要以这种方式,否则客户端调用的时候CXF服务端会接收不到参数的值,name:参数名称,可不写(建议写上),targetNamespace:命名空间,一定要填写上,默认是包名反过来的顺序,mode:参数类型,IN表示输入。

    3)编写一个实现类,实现接口的方法;

    4)和spring的集成,编写一个bean文件,如:cxf-beans.xml,内容如下:

    Cxf-beans.xml代码 复制代码 收藏代码
    1. <?xml version="1.0" encoding="UTF-8" ?>   
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
    5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   
    6.                         http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">   
    7.   
    8.     <import resource="classpath:META-INF/cxf/cxf.xml" />   
    9.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />   
    10.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />   
    11.        
    12.     <jaxws:endpoint id="vote" implementor="com.zcl.cxf.service.VoteImpl" address="/Vote" />   
    13. </beans>  

     这个文件比较容易理解,就不解释了。

    5)配置CXFServlet

    在web.xml文件中配置CXFServlet,加载cxf-beans.xml文件,内容如下:

    Web.xml代码 复制代码 收藏代码
    1. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    2.     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    3.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    4.     id="WebApp_ID" version="2.5">   
    5.   
    6.     <context-param>   
    7.         <param-name>contextConfigLocation</param-name>   
    8.         <param-value>WEB-INF/cxf-beans.xml</param-value>   
    9.     </context-param>   
    10.        
    11.     <listener>   
    12.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
    13.     </listener>   
    14.        
    15.     <servlet>   
    16.         <servlet-name>cxf</servlet-name>   
    17.         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>   
    18.         <load-on-startup>1</load-on-startup>   
    19.     </servlet>   
    20.     <servlet-mapping>   
    21.         <servlet-name>cxf</servlet-name>   
    22.         <url-pattern>/services/*</url-pattern>   
    23.     </servlet-mapping>   
    24. </web-app>  

     把工程部署到中间件,如tomcat,就可以访问该webservice了。

    3.JDK开发webservice方式

    1)编写一个Java类,如下:

    Jdkwebservice.java代码 复制代码 收藏代码
    1. package demo;   
    2.   
    3. import javax.jws.WebParam;   
    4. import javax.jws.WebService;   
    5. import javax.xml.ws.Endpoint;   
    6.   
    7. @WebService   
    8. public class JdkWebService {   
    9.   
    10.     public String doSomething(@WebParam(name="value", targetNamespace = "http://demo/", mode = WebParam.Mode.IN)String value) {   
    11.         return "Just do it," + value + "!";   
    12.     }   
    13.        
    14.     public static void main(String[] args) {   
    15.         Endpoint.publish("http://localhost:8080/jdkwsdemo/demo.JdkWebService", new JdkWebService());   
    16.     }   
    17. }  

     2)运行该java类,在浏览器上就可以访问该webservice了。

    注意:开发web工程的时候,这种方法不太友好。我们可以编写一个servlet类,在servlet类的初始化方法中发布webservice,这样我们的中间件服务器启动的时候就会帮我们自动webservice了。

     4. xfire方式

    开发WebService的框架不少,每个框架都有各自的有点,最近我用xfire练习开发WebService,下面是开发WebService的小例子,希望对入门的人有些小帮助  1.新建一个java web project命名为TestWebService,将xfire相关的jar包添加到lib目录中,写接口类和实现类 
    Java代码 复制代码 收藏代码
    1. package com.lamp.service;   
    2.   
    3. public interface MessageService {   
    4.     public String getName(String name);   
    5. }  
    实现类 
    Java代码 复制代码 收藏代码
    1. package com.lamp.service.impl;   
    2.   
    3. import com.lamp.service.MessageService;   
    4.   
    5. public class MessageServiceImpl implements MessageService {   
    6.   
    7.     public String getName(String name) {   
    8.         return "hellow " + name + ", welcome to WebService world";   
    9.     }   
    10.   
    11. }  
    在src目录下新建文件夹META-INF,然后再在其下新建文件夹xfire,在xfire目录下新建配置文件services.xml 
    Xml代码 复制代码 收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
    3.   <service>  
    4.     <name>MessageService</name>  
    5.     <serviceClass>com.lamp.service.MessageService</serviceClass>  
    6.     <implementationClass>com.lamp.service.impl.MessageServiceImpl</implementationClass>  
    7.   </service>  
    8. </beans>  
    最后在web.xml中配置xfire的servlet 
    Xml代码 复制代码 收藏代码
    1. <servlet>  
    2.         <servlet-name>XFireServlet</servlet-name>  
    3.         <servlet-class>  
    4.             org.codehaus.xfire.transport.http.XFireConfigurableServlet   
    5.         </servlet-class>  
    6.     </servlet>  
    7.   
    8.     <servlet-mapping>  
    9.         <servlet-name>XFireServlet</servlet-name>  
    10.         <url-pattern>/servlet/XFireServlet/*</url-pattern>  
    11.     </servlet-mapping>  
    12.   
    13.     <servlet-mapping>  
    14.         <servlet-name>XFireServlet</servlet-name>  
    15.         <url-pattern>/services/*</url-pattern>  
    16.     </servlet-mapping>  
    项目部署后在浏览器中通过http://localhost:8080/TestWebService/services访问看到远程访问的接口,并得到wsdl为http://localhost:8080/TestWebService/services/MessageService?wsdl 
    这样服务器端开发完毕,现在开始客户端的开发  新建一个java project也将xfire相关的jar引入,我用ant在客户端生成代理对象,在项目路径下新建build.xml,代码为 
    Xml代码 复制代码 收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2.   
    3. <project name="WebService" basedir="." default="gen-webservice">  
    4.   
    5.     <property file="build.properties">  
    6.     </property>  
    7.   
    8.     <path id="project-classpath">  
    9.         <fileset dir="${lib.dir}">  
    10.             <include name="**/*.jar" />    
    11.         </fileset>  
    12.     </path>  
    13.   
    14.     <target name="gen-webservice">  
    15.         <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="project-classpath" />  
    16.   
    17.         <wsgen outputDirectory="${src.dir}"  
    18.           wsdl="${wsdl.dir}" package="com.lamp.ws.client" overwrite="true"/>  
    19.            
    20.     </target>  
    21.   
    22. </project>  
    其引入的build.properties文件也在项目路径下  src.dir=${basedir}/src  lib.dir=F:/WebService/xfire-1.2.6/lib  wsdl.dir=http://localhost:8080/TestWebService/services/MessageService?wsdl  其中lib.jar为我存放xfire的路径,运行ant得到代理对象  编写一个测试类 
    Java代码 复制代码 收藏代码
    1. package com.lamp.test;   
    2.   
    3. import com.lamp.ws.client.MessageServiceClient;   
    4. import com.lamp.ws.client.MessageServicePortType;   
    5.   
    6. public class TestGetName {   
    7.   
    8.     public static void main(String[] args) {   
    9.         MessageServiceClient msg = new MessageServiceClient();   
    10.         MessageServicePortType portType = msg.getMessageServiceHttpPort();   
    11.         String result = portType.getName("张三");   
    12.         System.out.println(result);   
    13.     }   
    14.   
    15. }  
    运行在控制台看到了hellow 张三, welcome to WebService world至此一个简单的WebService开发完毕

    ------------------------------------------------------------------------------------------------

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录。

     

     现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!!     由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和大家一起来研究研究webservice的各种使用方法。      一、利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务      1.首先建立一个Web services EndPoint:

    package Hello;    import javax.jws.WebService;    import javax.jws.WebMethod;    import javax.xml.ws.Endpoint;       @WebService   public class Hello {     @WebMethod   public String hello(String name) {    return "Hello, " + name + " ";    }          public static void main(String[] args) {       // create and publish an endpoint           Hello hello = new Hello();           Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", hello);             }   

             2.使用 apt 编译 Hello.java(例:apt -d [存放编译后的文件目录] Hello.java ) ,会生成 jaws目录     3.使用java Hello.Hello运行,然后将浏览器指向http://localhost:8080/hello?wsdl就会出现下列显示      4.使用wsimport 生成客户端             使用如下:wsimport -p . -keep http://localhost:8080/hello?wsdl
        这时,会在当前目录中生成如下文件:                   5.客户端程序:       

    1class HelloClient{    2public static void main(String args[]) {    3  HelloService service = new HelloService();    4  Hello helloProxy = service.getHelloPort();    5  String hello = helloProxy.hello("你好");           6  System.out.println(hello);    7  }    8} 9

            以上方法还稍显繁琐,还有更加简单的方法   二、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的     利用xfire开发WebService,可以有三种方法:       1一种是从javabean 中生成;       2 一种是从wsdl文件中生成;       3 还有一种是自己建立webservice     步骤如下:     用myeclipse建立webservice工程,目录结构如下:        首先建立webservice接口,      代码如下:

         

    1package com.myeclipse.wsExample; 2//Generated by MyEclipse 3 4public interface IHelloWorldService { 5     6    public String example(String message); 7     8}

          接着实现这个借口:

     1package com.myeclipse.wsExample;  2//Generated by MyEclipse  3  4public class HelloWorldServiceImpl implements IHelloWorldService {  5      6    public String example(String message) {  7        return message;  8    }  9     10}

       修改service.xml 文件,加入以下代码:  

     1<service>  2        <name>HelloWorldService</name>  3        <serviceClass>  4            com.myeclipse.wsExample.IHelloWorldService  5        </serviceClass>  6        <implementationClass>  7            com.myeclipse.wsExample.HelloWorldServiceImpl  8        </implementationClass>  9        <style>wrapped</style> 10        <use>literal</use> 11        <scope>application</scope> 12    </service>

     把整个项目部署到tomcat服务器中 ,打开浏览器,输入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl,可以看到如下:         然后再展开HelloWorldService后面的wsdl可以看到:    客户端实现如下:

     1package com.myeclipse.wsExample.client;  2  3import java.net.MalformedURLException;  4import java.net.URL;  5  6import org.codehaus.xfire.XFireFactory;  7import org.codehaus.xfire.client.Client;  8import org.codehaus.xfire.client.XFireProxyFactory;  9import org.codehaus.xfire.service.Service; 10import org.codehaus.xfire.service.binding.ObjectServiceFactory; 11 12import com.myeclipse.wsExample.IHelloWorldService; 13 14public class HelloWorldClient { 15public static void main(String[] args) throws MalformedURLException, Exception { 16// TODO Auto-generated method stub 17Service s=new ObjectServiceFactory().create(IHelloWorldService.class); 18XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire()); 19String url="http://localhost:8989/HelloWorld/services/HelloWorldService"; 20 21        try 22        {             23             24            IHelloWorldService hs=(IHelloWorldService) xf.create(s,url); 25            String st=hs.example("zhangjin"); 26            System.out.print(st); 27        } 28        catch(Exception e) 29        { 30            e.printStackTrace(); 31        } 32    } 33 34} 35

           这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net 做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:         

     1public static void main(String[] args) throws MalformedURLException, Exception {  2        // TODO Auto-generated method stub  3        Service s=new ObjectServiceFactory().create(IHelloWorldService.class);  4        XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());  5          6          7//远程调用.net开发的webservice  8Client c=new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));  9        Object[] o=c.invoke("qqCheckOnline", new String[]{"531086641","591284436"}); 10         11//调用.net本机开发的webservice 12Client c1=new Client(new URL("http://localhost/zj/Service.asmx?wsdl")); 13Object[] o1=c1.invoke("HelloWorld",new String[]{}); 14         15}

       三、使用axis1.4调用webservice方法    前提条件:下载axis1.4包和tomcat服务器   ,并将axis文件夹复制到tomcat服务器的webapp文件夹中    这里我就说一下最简单的方法:          首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入http://localhost:8989/axis/HelloWorld.jws?wsdl,就会得到一个wsdl文件,其客户端调用方法如下:   

     1import javax.xml.rpc.Service;  2import javax.xml.rpc.ServiceException;  3import javax.xml.rpc.ServiceFactory;  4  5import java.net.MalformedURLException;  6import java.net.URL;  7import java.rmi.RemoteException;  8  9import javax.xml.namespace.QName; 10 11public class TestHelloWorld { 12 13 14    public static void main(String[] args) throws MalformedURLException, ServiceException, RemoteException { 15        // TODO Auto-generated method stub 16         17        String wsdlUrl ="http://localhost:8989/axis/HelloWorld.jws?wsdl"; 18        String nameSpaceUri ="http://localhost:8989/axis/HelloWorld.jws"; 19        String serviceName = "HelloWorldService"; 20        String portName = "HelloWorld"; 21         22        ServiceFactory serviceFactory = ServiceFactory.newInstance(); 23        Service afService =serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri, serviceName)); 24        HelloWorldInterface proxy = (HelloWorldInterface)afService.getPort(new QName(nameSpaceUri, portName),HelloWorldInterface.class); 25        System.out.println("return value is "+proxy.getName("john") ) ; 26         27    } 28 29} 30

    四、使用axis2开发webservice(这里首先感谢李宁老师)       使用axis2 需要先下载 

       axis2-1.4.1-bin.zip

       axis2-1.4.1-war.zip

      http://ws.apache.org/axis2/      同理,也需要将axis2复制到webapp目录中 在axis2中部署webservice有两种方法,     第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名     第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明     下面分别说明使用方法:     1.pojo方式:在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。先实现一个pojo类:  

     1public class HelloWorld{  2    public String getName(String name)  3    {  4        return "你好 " + name;  5    }      6    public int add(int a,int b)  7    {  8        return a+b;  9    }     10} 11

       由于这两个方法都是public类型,所以都会发布成webservice。编译HelloWorld类后,将HelloWorld.class文件放到%tomcat%webappsaxis2WEB-INFpojo目录中(如果没有pojo目录,则建立该目录),然后打开浏览器进行测试: 输入一下url: 

    http://localhost:8080/axis2/services/listServices

    会列出所有webservice    这是其中的两个webservice列表,接着,在客户端进行测试: 首先可以写一个封装类,减少编码,代码如下:      

     1package MZ.GetWebService;  2import javax.xml.namespace.QName;  3  4import org.apache.axis2.AxisFault;  5import org.apache.axis2.addressing.EndpointReference;  6import org.apache.axis2.client.Options;  7import org.apache.axis2.rpc.client.RPCServiceClient;  8  9 10public class GetWSByAxis2 { 11      private static String EndPointUrl; 12      private static String QUrl="http://ws.apache.org/axis2"; 13      private QName opAddEntry;  14      public String WSUrl; 15      public RPCServiceClient setOption() throws AxisFault 16      { 17          RPCServiceClient serviceClient = new RPCServiceClient(); 18          Options options = serviceClient.getOptions(); 19          EndpointReference targetEPR = new EndpointReference(WSUrl); 20          options.setTo(targetEPR); 21          return serviceClient; 22      } 23       24      public QName getQname(String Option){ 25           26          return new QName (QUrl,Option); 27      } 28 //返回String 29      public String getStr(String Option) throws AxisFault 30      { 31          RPCServiceClient serviceClient =this.setOption();  32      33          opAddEntry =this.getQname(Option); 34       35         String str = (String) serviceClient.invokeBlocking(opAddEntry,  36                          new Object[]{}, new Class[]{String.class })[0]; 37         return str; 38     } 39// 返回一维String数组 40      public String[] getArray(String Option) throws AxisFault 41      { 42          RPCServiceClient serviceClient =this.setOption();  43      44          opAddEntry =this.getQname(Option); 45       46         String[] strArray = (String[]) serviceClient.invokeBlocking(opAddEntry,  47                          new Object[]{}, new Class[]{String[].class })[0]; 48         return strArray; 49     } 50      //从WebService中返回一个对象的实例 51     public Object getObject(String Option,Object o) throws AxisFault 52     {  53        RPCServiceClient serviceClient =this.setOption();  54         QName qname=this.getQname(Option); 55         Object object = serviceClient.invokeBlocking(qname, new Object[]{},new Class[]{o.getClass()})[0]; 56         return object; 57     } 58      59/////////////////////////////////////////       读者可以自己封装数据类型,如int,byte,float等数据类型 60} 61

    客户端调用方法:  

    MZ.GetWebService.GetWSByAxis2 ws=new MZ.GetWebService.GetWSByAxis2(); ws.WSUrl="http://localhost:8989/axis2/services/HelloWorld"; HelloWorld hello= (HelloWorld)ws.getObject("getName", HelloWorld.class);                           System.out.println(hello.getName("zhangjin"));

         2.使用service.xml发布webservice,这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:

    <service name="HelloWorld">     <description>         HelloWorld webservice     </description>     <parameter name="ServiceClass">         service.HelloWorld       </parameter>     <messageReceivers>         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"             class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"             class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />     </messageReceivers> </service>

    其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容: http://localhost:8080/axis2/services/myService?wsdl   除此之外,还有直接可以在其中制定webservice操作方法:可以这样些service.xml文件

     1<service name="HelloWorld">  2    <description>  3       HelloWorld service  4    </description>  5    <parameter name="ServiceClass">  6        service.HelloWorld    7    </parameter>  8    <operation name="getName">  9        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> 10    </operation> 11    <operation name="add"> 12        <messageReceiver 13            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> 14    </operation> 15</service> 16

    如果要发布多个webservice,可以在文件两段加上<serviceGroup><service></service>...<service></service></serviceGroup>发布

  • 相关阅读:
    spring mvc给参数起别名
    聊聊分布式定时任务中间件架构及其实现--转
    Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构
    终端安全工具 gartner 排名
    When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向
    DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网
    DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp
    DNS隧道工具汇总——补充,还有IP over DNS的工具NSTX、Iodine、DNSCat
    Data Mining and Machine Learning in Cybersecurity PDF
    ES failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not locked
  • 原文地址:https://www.cnblogs.com/qiu18359243869/p/10867490.html
Copyright © 2011-2022 走看看