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.v20160121与OpenJDK 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地址。