Vert.x 核心模块 编写TCP服务器端(五)

Vert.x使编写非阻塞的TCP客户端和服务器变的简单

创建TCP服务

最简单的方法使用如下代码使用默认选项创建一个TCP服务器

NetServerserver = vertx.createNetServer();

配置TCP服务器

默认服务器如果不是你想要的,可以根据传入的NetServerOptions参数创建。

NetServerOptionsoptions = new NetServerOptions().setPort(4321);

NetServerserver = vertx.createNetServer(options);

启动服务侦听

为让服务器侦听到来的请求,请使用一个listen方法启动侦听,通过指定配置让服务器在指定的网卡和端口上进行侦听。

NetServerserver = vertx.createNetServer();

server.listen();

或者在在调用listen方法时指定主机和端口

NetServerserver = vertx.createNetServer();

server.listen(1234,"localhost");

默认的主机是0.0.0.0,这意味着侦听机器上的所有网卡地址,默认的端口是0,这是一个特定值,是让服务器随机使用一个本地端口侦听。

实际绑定是异步的,所以服务不是立侦听,而是在调用listen方法反回之后才开始侦听请求。如果在服务器实际开始侦听时得到通知,可以提供调用listen方法时提供一个处理器。例如:

NetServerserver = vertx.createNetServer();

server.listen(1234,"localhost", res -> {

  if (res.succeeded()) {

    System.out.println("Server is nowlistening!");

  } else {

    System.out.println("Failed tobind!");

  }

});

在随机端口上侦听

如果0被用作侦听端口,服务器将找到一个随机未被使用的端口进行侦听。为了找到服务器侦听一真实端口,可以调用actualPort方法获取。

NetServerserver = vertx.createNetServer();

server.listen(0,"localhost", res -> {

  if (res.succeeded()) {

    System.out.println("Server is nowlistening on actual port: " + server.actualPort());

  } else {

    System.out.println("Failed tobind!");

  }

});

到来连接时获得通知

为了获取连接到来时的通知,需要设置connectionHandler:

NetServerserver = vertx.createNetServer();

server.connectHandler(socket-> {

  // Handle the connection in here

});

当有连接时,处理器将会传入NetSocket实例并执。NetSocket是一个类似Socket表示实际连接的接口,并且允许读取和写入数据,同时也可以做其他事,比如关闭Soceket.

从Socket中读取数据

为了从socket中读取数据,可以在socket上设置处理器。在每当有数据从Socket接收时,会传入一个缓冲器并执行。

NetServerserver = vertx.createNetServer();

server.connectHandler(socket-> {

  socket.handler(buffer -> {

    System.out.println("I received somebytes: " + buffer.length());

  });

});

 

向socket写数据

使用任一write方法向socket写数据

Bufferbuffer = Buffer.buffer().appendFloat(12.34f).appendInt(123);

socket.write(buffer);

// Writea string in UTF-8 encoding

socket.write("somedata");

// Writea string using the specified encoding

socket.write("somedata", "UTF-16");

写操作是移步的不会直到写方法返回时也真正的写数据。

关闭时的处理器

如果希望在socket关闭时被通知,可以用closeHandler添加处理器。

socket.closeHandler(v-> {

  System.out.println("The socket has beenclosed");

});

处理异常

可能通过exceptionHandler设置处理器,接收一个socket上产生的异常。

事件总线写处理器

每个socket自动向事件总线注册一个处理器,在一些缓冲器在这处理器上被收到后,处理器将缓冲器写给自己。这让你可以将缓冲器数据发送到某个地址上注册的处理器,然后向某个socket写数据,Socket可能存在于不同的verticle或甚至于在不同的Vert.x实例中

处理器的地址被指定为writeHandlerID

本地和远程地址

用localAddress可以获取NetSocket的本地地址。使用remoteAddress可以获取NetSocket的远程地址(例连接另外一端的地址)。

从类路径中发送文件或资源

文件和类路径资源可以用sendFile真接写进socket. 这是一个发送文件的有效方法,因为可以通过操作系统内核直接处理,只需此操作系统支持。

为了解类路径方法的限制与禁用项,请参看关于从类路径服务文件章节

socket.sendFile("myfile.dat");

流Socket

NetSocket实例也是ReadStream和WriteStream实例,所以流可以从其他读写流中抽取数。为了获取更多信息,请参看流和泵章节。

连接升级到SSL/TLS

一个非SSL/TLS连接通过upgradeToSsl能被升级到SSL/TLS连接。服务器或客户端必须配置为SSL/TLS才能正确工作。更多信息请参看SSL/TLS章节。

关闭TCP服务器

调用close方法关闭服务器。关闭服务器时将关闭所有打开的连接并释放所有服务器资源。关闭是异步的,当调用close方法返回后一段时间,也可能并未关闭。如果在实际关系时得到关闭通知,可在调用关闭方法时传入一个处理器。

server.close(res-> {

  if (res.succeeded()) {

    System.out.println("Server is nowclosed");

  } else {

    System.out.println("closefailed");

  }

});

在Verticles中自动清除

如果TCP服务器和客户端是在verticle内部创建,这些服务器和客户端将在verticle卸载时自动关闭。

伸缩-共享TCP服务器

一些TCP服务的处理器总是在相同的事件循环线程中被执行。这意味如你在一个有多核的服务器运行仅一个布署的事件总线实例,这样你只能使用一个CPU运算核心。为第运用你的服务器的更运运算核心,需要布署多个服务器实例。可以在程序中初始化多个服务器实例:

for (inti = 0; i < 10; i++) {

  NetServer server = vertx.createNetServer();

  server.connectHandler(socket -> {

    socket.handler(buffer -> {

      // Just echo back the data

      socket.write(buffer);

    });

  });

  server.listen(1234, "localhost");

}

如果你使用Verticles,只需简单布署多个服务器的verticle 实例,可以通过设置命令行参数-instance选项实现

vertx runcom.mycompany.MyVerticle -instances 10

程序中布署多实例的verticle如下代码:
DeploymentOptions options = new DeploymentOptions().setInstances(10);

vertx.deployVerticle("com.mycompany.MyVerticle",options);

 

一旦这样做,你将发现和之前一样的工作。但是所有服务器的运算核心都将被使用,可以完成更多的工作。

这时你可能会问你自己’多个服务器怎么能侦听在同一个主机地址和相同的端口上?,确实,只要试图布署多过一个的实例,你会得到端口冲突。

Vert.x在此处施了一点魔法。

在你布署另外服务器到已经存在服务器的相同host和相同端口时,此时实际不会创建新的服务器侦听相同的主机/端口。

相反,在Vert.x内部仅维护一个单一的服务,并且当连接到达时,Vert.x将用Round-robin方式将它们分发给处理器。因此,Vert.xTCP服务器可以伸缩到所有可用的运算核心,每个运算核心都保持一个单一的线程实例。

创建TCP客户端

最简的创建TCP客户端的方法是使用所有默认选项:

NetClientclient = vertx.createNetClient();

配置TCP客户端

在创建TCP客户时,你不想使用默认选项,可以使用NetClientOptions将配置传入。

NetClientOptionsoptions = new NetClientOptions().setConnectTimeout(10000);

NetClientclient = vertx.createNetClient(options);

 

建立连接

使用connect方法与服务器建立连接,并指定端口号与主机地址及一个处理器,此处理器将会传入一个NetSocket。当连接成功或失败时,此处理器都会被调用。

NetClientOptionsoptions = new NetClientOptions().setConnectTimeout(10000);

NetClientclient = vertx.createNetClient(options);

client.connect(4321,"localhost", res -> {

  if (res.succeeded()) {

    System.out.println("Connected!");

    NetSocket socket = res.result();

  } else {

    System.out.println("Failed to connect:" + res.cause().getMessage());

  }

});

配置连接重试

为了能在客户不能连接到服务器时,能自动重新连接到服务器,可能通过setReconnectInterval和setReconnectAttempts方法设置。

注释:如果连接失败,当前Vert.x不会试去连接。重连偿试和间隔仅在创建初始化连接是使用。

NetClientOptionsoptions = new NetClientOptions().

    setReconnectAttempts(10).

    setReconnectInterval(500);

 

NetClientclient = vertx.createNetClient(options);

多个连接偿试默认被禁用。

记录网络活动

因为调试目的,网络活动需要记录:

NetServerOptionsoptions = new NetServerOptions().setLogActivity(true);

NetServerserver = vertx.createNetServer(options);

客户端:

NetClientOptionsoptions = new NetClientOptions().setLogActivity(true);

NetClientclient = vertx.createNetClient(options);

网络活动被Netty使用io.netty.handler.logging.LoggingHandler名称记录为DEBUG日志级别。当使用网络活动日志,有些事情需记住:

·          日志不是由Vert.x记录而是由Netty记录

·          这不是一个产品特性

Netty将下列顺序定位下列日志记录器的实现:

·          Slf4j

·          Log4j

·          JDK

如果slf4j和log4j类出现在类路径中,并足以获得日志实现。这个日志记录器会被强制直接指定为Netty内部日志的实现:

// Forcelogging to SLF4J

InternalLoggerFactory.setDefaultFactory(Log4JLoggerFactory.INSTANCE);

配置服务器与客户端使用SSL/TLS

TCP客户端和服务器可以被配置为使用TLS-早期TLS版本为众所周知的SSL。在是否使用SSL/TLS的客户端与服务器端API完全一样,这是通过NetClientOptions或NetServerOptions实例在创建服务器与客户端时设置的。

在服务器端启用SSL/TLS

SSL/TLS使用ssl启用,默认是禁用的。

给服务器指定密码与证书

SSL/TLS服务器通常向客户提供证书,便于验证客户端身份。证书/密码能用多种方法配置:第一个方法用于指定java密钥仓库(包含证书与私钥)的位置。Java密钥仓库可经用keytool工具管理,JDK中有keytool工具。密钥仓库的密码必须提供:

NetServerOptionsoptions = new NetServerOptions().setSsl(true).setKeyStoreOptions(

    new JksOptions().

       setPath("/path/to/your/server-keystore.jks").

       setPassword("password-of-your-keystore")

);

NetServerserver = vertx.createNetServer(options);

作为别外选择,可以将密钥仓库读取到缓冲器中并直接提供:
Buffer myKeyStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/server-keystore.jks");

JksOptionsjksOptions = new JksOptions().

    setValue(myKeyStoreAsABuffer).

   setPassword("password-of-your-keystore");

NetServerOptionsoptions = new NetServerOptions().

    setSsl(true).

    setKeyStoreOptions(jksOptions);

NetServerserver = vertx.createNetServer(options);

PKCS#12 (http://en.wikipedia.org/wiki/PKCS_12)格式的密钥和证书通常以.pfx或者.p12为扩展名,这种密钥和证证与流行的JKS密钥仓库一样能加载:

NetServerOptionsoptions = new NetServerOptions().setSsl(true).setPfxKeyCertOptions(

    new PfxOptions().

       setPath("/path/to/your/server-keystore.pfx").

       setPassword("password-of-your-keystore")

);

NetServerserver = vertx.createNetServer(options);

缓冲器的配置也被支持

BuffermyKeyStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/server-keystore.pfx");

PfxOptionspfxOptions = new PfxOptions().

    setValue(myKeyStoreAsABuffer).

    setPassword("password-of-your-keystore");

NetServerOptionsoptions = new NetServerOptions().

    setSsl(true).

    setPfxKeyCertOptions(pfxOptions);

NetServerserver = vertx.createNetServer(options);

另外一种提供服务器私钥和证的的方式是分别使用 .pem文件

NetServerOptionsoptions = new NetServerOptions().setSsl(true).setPemKeyCertOptions(

    new PemKeyCertOptions().

       setKeyPath("/path/to/your/server-key.pem").

       setCertPath("/path/to/your/server-cert.pem")

);

NetServerserver = vertx.createNetServer(options);

缓冲器本置的方也也支持

BuffermyKeyAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/server-key.pem");

BuffermyCertAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/server-cert.pem");

PemKeyCertOptionspemOptions = new PemKeyCertOptions().

    setKeyValue(myKeyAsABuffer).

    setCertValue(myCertAsABuffer);

NetServerOptionsoptions = new NetServerOptions().

    setSsl(true).

    setPemKeyCertOptions(pemOptions);

NetServerserver = vertx.createNetServer(options);

记信Pem配置的方式,私钥是未加密的。

指定服务器的信任

SSL/TLS服务器使用证书的权力去检查客户端身份。证书认证可以由几种方式由服务器配置。JAVA信任密钥库可用JDK自带的keytool工具管理。但必须提供密钥库密码:

NetServerOptions options = newNetServerOptions().

   setSsl(true).

   setClientAuth(ClientAuth.REQUIRED).

   setTrustStoreOptions(

       new JksOptions().

           setPath("/path/to/your/truststore.jks").

           setPassword("password-of-your-truststore")

    );

NetServer server =vertx.createNetServer(options);

可以自己使用Buffer方式读取密钥库直接配置服务器;

Buffer myTrustStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/truststore.jks");

NetServerOptions options = new NetServerOptions().

   setSsl(true).

   setClientAuth(ClientAuth.REQUIRED).

   setTrustStoreOptions(

        new JksOptions().

           setValue(myTrustStoreAsABuffer).

           setPassword("password-of-your-truststore")

    );

NetServer server =vertx.createNetServer(options);

PKCS#12 (http://en.wikipedia.org/wiki/PKCS_12)格式的密钥和证书通常以.pfx或者.p12为扩展名,这种密钥和证证与流行的JKS密钥仓库一样能加载:

NetServerOptions options = newNetServerOptions().

   setSsl(true).

   setClientAuth(ClientAuth.REQUIRED).

   setPfxTrustOptions(

       new PfxOptions().

           setPath("/path/to/your/truststore.pfx").

           setPassword("password-of-your-truststore")

    );

NetServer server =vertx.createNetServer(options);

Buffer配置方式也支持

Buffer myTrustStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/truststore.pfx");

NetServerOptions options = new NetServerOptions().

   setSsl(true).

   setClientAuth(ClientAuth.REQUIRED).

   setPfxTrustOptions(

       new PfxOptions().

           setValue(myTrustStoreAsABuffer).

           setPassword("password-of-your-truststore")

    );

NetServer server = vertx.createNetServer(options);

另外的提供服务器证书授权的方式是使用 .pem文件列表

NetServerOptions options = newNetServerOptions().

   setSsl(true).

   setClientAuth(ClientAuth.REQUIRED).

   setPemTrustOptions(

       new PemTrustOptions().

           addCertPath("/path/to/your/server-ca.pem")

    );

NetServer server =vertx.createNetServer(options);

Buffer配置方式也支持:

Buffer myCaAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/server-ca.pfx");

NetServerOptions options = newNetServerOptions().

   setSsl(true).

   setClientAuth(ClientAuth.REQUIRED).

   setPemTrustOptions(

       new PemTrustOptions().

           addCertValue(myCaAsABuffer)

    );

NetServer server =vertx.createNetServer(options);

在客户端启用SSL/TLS

网络客户端使用SSL很容易配置。服务器与客户端有着在标准Socket使用SSL相同的API。为了在NetClient上启用SSL功能,请调用setSSL(true)方法。

客户端信任配置

客户端如果trustAll设置为true,客户端将信任所有的服务器证书。连接将一直被加密,但此模式易受到中间人方式攻击。如,你不能确认谁连接了。请小心使用,默认值为false.

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setTrustAll(true);

NetClient client = vertx.createNetClient(options);

如果trustAll没有设置,客户端密钥库必须被配置并且应当包含客户端信任的服务器证书。默认的,主机验证在客户端是禁用的。为了启用主机端验证,设置在客户端使用的算法(当前仅HTTPS和LDAPS被支持):

NetClientOptions options = newNetClientOptions().

       setSsl(true).

       setHostnameVerificationAlgorithm("HTTPS");

NetClient client =vertx.createNetClient(options);

同服务器配置一样,客户端信任可能用多种方式配置:

第一种方法是指定包含授权证书的java密钥库地址,它是一标准的java密钥库,与服务器端密钥库一样。客户密钥库地址通过调用Jks option上的path功能进行设置。在客户端连接时,服务器出示的证书不在客户端的密钥库中,连接偿试将不会成功。

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setTrustStoreOptions(

       new JksOptions().

           setPath("/path/to/your/truststore.jks").

           setPassword("password-of-your-truststore")

    );

NetClient client =vertx.createNetClient(options);

Buffer配置方式也被支持

Buffer myTrustStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/truststore.jks");

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setTrustStoreOptions(

       new JksOptions().

           setValue(myTrustStoreAsABuffer).

           setPassword("password-of-your-truststore")

);

NetClient client =vertx.createNetClient(options);

 

PKS#12格式的授权证书,通常是以 .pfx 或者是.p12扩展名的文件也能同时兴的JKS密钥库一样被加载:

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setPfxTrustOptions(

       new PfxOptions().

           setPath("/path/to/your/truststore.pfx").

           setPassword("password-of-your-truststore")

    );

NetClient client =vertx.createNetClient(options);

 

Buffer配置方式也被支持

Buffer myTrustStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/truststore.pfx");

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setPfxTrustOptions(

       new PfxOptions().

           setValue(myTrustStoreAsABuffer).

           setPassword("password-of-your-truststore")

    );

NetClient client =vertx.createNetClient(options);

另外一种提供服务器授权证书的方式是.pem文件列表

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setPemTrustOptions(

       new PemTrustOptions().

            addCertPath("/path/to/your/ca-cert.pem")

    );

NetClient client =vertx.createNetClient(options);

Buffer的配置方式如下:

Buffer myTrustStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/ca-cert.pem");

NetClientOptions options = new NetClientOptions().

   setSsl(true).

   setPemTrustOptions(

       new PemTrustOptions().

           addCertValue(myTrustStoreAsABuffer)

    );

NetClient client =vertx.createNetClient(options);

 

客户端说明密码及证书

在连接的时候,如果服务器要求客户证书,客户端必须出示自己的证书给服务器。客户端也有多种配置方式:

第一种是指定包含密码和证书的java密钥库的文件地址。仅是一个正常的java密钥库。通过jksoptions的path功能设置密钥库地址。

NetClientOptions options = newNetClientOptions().setSsl(true).setKeyStoreOptions(

    newJksOptions().

       setPath("/path/to/your/client-keystore.jks").

       setPassword("password-of-your-keystore")

);

NetClient client =vertx.createNetClient(options);

也支持Buffer的配置方式:

Buffer myKeyStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/client-keystore.jks");

JksOptions jksOptions = new JksOptions().

   setValue(myKeyStoreAsABuffer).

   setPassword("password-of-your-keystore");

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setKeyStoreOptions(jksOptions);

NetClient client =vertx.createNetClient(options);

PKS#12格式的授权证书,通常是以 .pfx 或者是.p12扩展名的文件也能同时兴的JKS密钥库一样被加载:

NetClientOptions options = newNetClientOptions().setSsl(true).setPfxKeyCertOptions(

    newPfxOptions().

       setPath("/path/to/your/client-keystore.pfx").

       setPassword("password-of-your-keystore")

);

NetClient client =vertx.createNetClient(options);

也支持Buffer的配置方式:

Buffer myKeyStoreAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/client-keystore.pfx");

PfxOptions pfxOptions = new PfxOptions().

   setValue(myKeyStoreAsABuffer).

   setPassword("password-of-your-keystore");

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setPfxKeyCertOptions(pfxOptions);

NetClient client =vertx.createNetClient(options);

另外的提供服务器证书授权的方式是使用 .pem文件列表

NetClientOptions options = new NetClientOptions().setSsl(true).setPemKeyCertOptions(

    newPemKeyCertOptions().

       setKeyPath("/path/to/your/client-key.pem").

       setCertPath("/path/to/your/client-cert.pem")

);

NetClient client =vertx.createNetClient(options);

也支持Buffer的配置方式:

Buffer myKeyAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/client-key.pem");

Buffer myCertAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/client-cert.pem");

PemKeyCertOptions pemOptions = newPemKeyCertOptions().

   setKeyValue(myKeyAsABuffer).

   setCertValue(myCertAsABuffer);

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setPemKeyCertOptions(pemOptions);

NetClient client =vertx.createNetClient(options);

记信pem配置,私钥是不加密的。

撤消授权证书

可能使用撤消列表(CRL)取消不在受信任的证书,crlPath配置要使用的crl列表:

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setTrustStoreOptions(trustOptions).

   addCrlPath("/path/to/your/crl.pem");

NetClient client =vertx.createNetClient(options);

Buffer配置也被支持:

Buffer myCrlAsABuffer =vertx.fileSystem().readFileBlocking("/path/to/your/crl.pem");

NetClientOptions options = newNetClientOptions().

   setSsl(true).

   setTrustStoreOptions(trustOptions).

   addCrlValue(myCrlAsABuffer);

NetClient client = vertx.createNetClient(options);

配置加密套件

默认的,TLS配置将使用运行Vert.x的JVM的加密套件.此加密套件由启用的加密器进行配置:

NetServerOptions options = newNetServerOptions().

   setSsl(true).

   setKeyStoreOptions(keyStoreOptions).

   addEnabledCipherSuite("ECDHE-RSA-AES128-GCM-SHA256").

    addEnabledCipherSuite("ECDHE-ECDSA-AES128-GCM-SHA256").

   addEnabledCipherSuite("ECDHE-RSA-AES256-GCM-SHA384").

   addEnabledCipherSuite("CDHE-ECDSA-AES256-GCM-SHA384");

NetServer server =vertx.createNetServer(options);

加密器套件通过NetServerOptions或者NetClientOption配置进行指定

 

配置TLS协议版本

默认的,TLS配置将使用下列协议版 本:SSLv2Hello, TLSv1, TLSv1.1 和TLSv1.2。协义版本可以显示添加协议进行配置:

NetServerOptions options = newNetServerOptions().

   setSsl(true).

   setKeyStoreOptions(keyStoreOptions).

   addEnabledSecureTransportProtocol("TLSv1.1").

   addEnabledSecureTransportProtocol("TLSv1.2");

   NetServer server = vertx.createNetServer(options);

协议版通过NetServerOptions或者NetClientOptions配置进行指定。

SSL引擎

SSL引擎实现可以使用OpenSSL代替JDK实现进行配置。OpenSSL提供了比JDK引擎好的性能和CPU应用,OpenSSL和JDK版本一样俱有独立性。

用的引擎选项有:

·          getSslEngineOptions

·          JdkSSLEngineOptions

NetServerOptions options = newNetServerOptions().

   setSsl(true).

   setKeyStoreOptions(keyStoreOptions);

 

// Use JDK SSL engine explicitly

options = new NetServerOptions().

   setSsl(true).

   setKeyStoreOptions(keyStoreOptions).

   setJdkSslEngineOptions(new JdkSSLEngineOptions());

 

// Use OpenSSL engine

options = new NetServerOptions().

   setSsl(true).

   setKeyStoreOptions(keyStoreOptions).

setOpenSslEngineOptions(newOpenSSLEngineOptions());

 

应用层协议协商

ALPN(应用层协议协商)是TLS应用层协义协商的扩展。它在HTTP/2中被使用:在TLS握手期间,客户端会给出应用协议一个列表。这个协议列表接收了服务器支持的协议的响应。

Java8不支持ALPN创新。所以ALPN应当用其他方式启用:

·          OpenSSL去持

·          Jetty-ALPN支持

使用的引擎选项有:

·          getSslEngineOptions

·          在JDK的ALPN可获取时,JdkSSLEngineOptions

·          在OPENSSL的ALPN可获取时,OpenSSLEngineOptions

·          否则会失败

OpenSSL ALPN支持

OpenSSL提供了本地ALPN支持。

OpenSSL要求配置setOpenSslEngineOptions和在类路径中有netty-tcnative jar包。根所tcnative的实现,在使用tcnative时需要在操作系统中安装OpenSSL.

OpenSSL严格密码/证书配置成.pem文件。然而也能使用任意的信任配置。

Jetty-ALPN支持

Jetty-ALPN是一个不大的jar包,它重写了Java8发行版中的一些类来支持ALPN。

为了使用Jetty-ALPN必须在JVM启动的类路径中添加alpn-boot-${version}.jar

-Xbootclasspath/p:/path/to/alpn-boot${version}.jar

${version}依赖JVM版本,如8.1.7.v20160121OpenJDK 1.8.0u74 对应。全部JDK支持列表可以http://www.eclipse.org/jetty/documentation/current/alpn-chapter.html地址获取。Jetty-ALPN主要缺点是版本依赖与JVM。

为了解决这个问题,可以使用Jetty ALPN agent代替。它是JVM代理,为不同的JVM选择正确的ALPN版本去行。

-javaagent:/path/to/alpn/agent

 

为客户端连接使用代理

NetClient支持HTTP/1.x CONNECT,socks4a或者SOCKS5代理。代理配置使用NetClientOptions中的ProxyOptions封装代理类型,主机名,端口和可选的用户名和密码进行配置。

这是一个例子:

NetClientOptions options = newNetClientOptions()

   .setProxyOptions(new ProxyOptions().setType(ProxyType.SOCKS5)

       .setHost("localhost").setPort(1080)

       .setUsername("username").setPassword("secret"));

NetClient client =vertx.createNetClient(options);

DNS解析总在代理服务器上,为了完成SOCKS4客户端功能,需要解决本地DNS地址。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值