编写 TCP 服务器和客户端 - 编写 TCP 客户端

优质
小牛编辑
135浏览
2023-12-01

创建 TCP 客户端

最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示:

  1. NetClient client = vertx.createNetClient();

配置 TCP 客户端

如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置:

  1. NetClientOptions options = new NetClientOptions().setConnectTimeout(10000);
  2. NetClient client = vertx.createNetClient(options);

建立连接

要连接到的服务器可以使用connect,指定端口和服务器地址和一个handler,handler包含 NetSocket 和成功或者失败的结果。

  1. NetClientOptions options = new NetClientOptions().setConnectTimeout(10000);
  2. NetClient client = vertx.createNetClient(options);
  3. client.connect(4321, "localhost", res -> {
  4. if (res.succeeded()) {
  5. System.out.println("Connected!");
  6. NetSocket socket = res.result();
  7. } else {
  8. System.out.println("Failed to connect: " + res.cause().getMessage());
  9. }
  10. });

配置自动重连

无法连接可以配置为自动重连。配置setReconnectIntervalsetReconnectAttempts.

注意
目前 Vert.x 不会尝试重新连接,如果连接失败,重连和重连间隔仅适用于创建初始连接。

  1. NetClientOptions options = new NetClientOptions().
  2. setReconnectAttempts(10).//重连次数
  3. setReconnectInterval(500)//重连间隔
  4. NetClient client = vertx.createNetClient(options);

默认情况下,自动重连不开启。

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

TCP 客户端和服务器可以配置使用TLS(安全传输层协议)-TLS 的早期版本被称为 SSL。

无论使用 SSL/TLS服务器和客户端 Api 是相同的,是否启用,通过NetClientOptionsNetServerOptions实例配置。

在服务器上启用 SSL/TLS

通过ssl启用 SSL/TLS.

默认是禁用的。

为服务器指定密钥/证书

SSL / TLS服务器通常提供证书给客户以验证他们的身份。

针对服务器的几种配置证书/密钥的方式:

第一种方法是通过指定 Java 密钥存储并包含证书和私钥的位置。

Java 密钥存储库可以使用JDK附带的实用程序keytool工具管理。
此外应提供密钥存储库的密码:

  1. NetServerOptions options = new NetServerOptions().setSsl(true).setKeyStoreOptions(
  2. new JksOptions().
  3. setPath("/path/to/your/server-keystore.jks").
  4. setPassword("password-of-your-keystore")
  5. );
  6. NetServer server = vertx.createNetServer(options);

或者,你可以把你自己的钥匙储存为一个缓冲区,直接提供:

  1. Buffer myKeyStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/server-keystore.jks");
  2. JksOptions jksOptions = new JksOptions().
  3. setValue(myKeyStoreAsABuffer).
  4. setPassword("password-of-your-keystore");
  5. NetServerOptions options = new NetServerOptions().
  6. setSsl(true).
  7. setKeyStoreOptions(jksOptions);
  8. NetServer server = vertx.createNetServer(options);

还可以以类似 JKS 方式 PKCS #12 格式 (http://en.wikipedia.org/wiki/PKCS_12)密钥存储加载密钥/证书,通常具有.pfx或.p12扩展名:

  1. NetServerOptions options = new NetServerOptions().setSsl(true).setPfxKeyCertOptions(
  2. new PfxOptions().
  3. setPath("/path/to/your/server-keystore.pfx").
  4. setPassword("password-of-your-keystore")
  5. );
  6. NetServer server = vertx.createNetServer(options);

此外支持缓冲区配置:

  1. Buffer myKeyStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/server-keystore.pfx");
  2. PfxOptions pfxOptions = new PfxOptions().
  3. setValue(myKeyStoreAsABuffer).
  4. setPassword("password-of-your-keystore");
  5. NetServerOptions options = new NetServerOptions().
  6. setSsl(true).
  7. setPfxKeyCertOptions(pfxOptions);
  8. NetServer server = vertx.createNetServer(options);

另一种方式,分别使用.pem文件提供服务器私钥和证书。

  1. NetServerOptions options = new NetServerOptions().setSsl(true).setPemKeyCertOptions(
  2. new PemKeyCertOptions().
  3. setKeyPath("/path/to/your/server-key.pem").
  4. setCertPath("/path/to/your/server-cert.pem")
  5. );
  6. NetServer server = vertx.createNetServer(options);

此外支持缓冲区配置:

  1. Buffer myKeyAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/server-key.pem");
  2. Buffer myCertAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/server-cert.pem");
  3. PemKeyCertOptions pemOptions = new PemKeyCertOptions().
  4. setKeyValue(myKeyAsABuffer).
  5. setCertValue(myCertAsABuffer);
  6. NetServerOptions options = new NetServerOptions().
  7. setSsl(true).
  8. setPemKeyCertOptions(pemOptions);
  9. NetServer server = vertx.createNetServer(options);

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

指定信任服务器

SSL / TLS服务器使用证书授权可以以验证客户端的身份。

几种针对服务器的证书授权的配置方法:

此外应提供密钥存储库的密码:

Java trust存储库可以使用 JDK附带的实用程序keytool工具管理。

此外应提供trust存储库的密码:

  1. NetServerOptions options = new NetServerOptions().
  2. setSsl(true).
  3. setClientAuth(ClientAuth.REQUIRED).
  4. setTrustStoreOptions(
  5. new JksOptions().
  6. setPath("/path/to/your/truststore.jks").
  7. setPassword("password-of-your-truststore")
  8. );
  9. NetServer server = vertx.createNetServer(options);

或者,你可以把你自己的trust储存为一个缓冲区,直接提供:

  1. Buffer myTrustStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/truststore.jks");
  2. NetServerOptions options = new NetServerOptions().
  3. setSsl(true).
  4. setClientAuth(ClientAuth.REQUIRED).
  5. setTrustStoreOptions(
  6. new JksOptions().
  7. setValue(myTrustStoreAsABuffer).
  8. setPassword("password-of-your-truststore")
  9. );
  10. NetServer server = vertx.createNetServer(options);

还可以以类似 JKS 方式 PKCS #12 格式 (http://en.wikipedia.org/wiki/PKCS_12) trust 存储加载密钥/证书,通常具有.pfx或.p12扩展名:

  1. NetServerOptions options = new NetServerOptions().
  2. setSsl(true).
  3. setClientAuth(ClientAuth.REQUIRED).
  4. setPfxTrustOptions(
  5. new PfxOptions().
  6. setPath("/path/to/your/truststore.pfx").
  7. setPassword("password-of-your-truststore")
  8. );
  9. NetServer server = vertx.createNetServer(options);

此外支持缓冲区配置:

  1. Buffer myTrustStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/truststore.pfx");
  2. NetServerOptions options = new NetServerOptions().
  3. setSsl(true).
  4. setClientAuth(ClientAuth.REQUIRED).
  5. setPfxTrustOptions(
  6. new PfxOptions().
  7. setValue(myTrustStoreAsABuffer).
  8. setPassword("password-of-your-truststore")
  9. );
  10. NetServer server = vertx.createNetServer(options);

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

  1. NetServerOptions options = new NetServerOptions().
  2. setSsl(true).
  3. setClientAuth(ClientAuth.REQUIRED).
  4. setPemTrustOptions(
  5. new PemTrustOptions().
  6. addCertPath("/path/to/your/server-ca.pem")
  7. );
  8. NetServer server = vertx.createNetServer(options);

此外支持缓冲区配置:

  1. Buffer myCaAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/server-ca.pfx");
  2. NetServerOptions options = new NetServerOptions().
  3. setSsl(true).
  4. setClientAuth(ClientAuth.REQUIRED).
  5. setPemTrustOptions(
  6. new PemTrustOptions().
  7. addCertValue(myCaAsABuffer)
  8. );
  9. NetServer server = vertx.createNetServer(options);
在客户端上启用 SSL/TLS

Net 客户端也可以轻松地配置为使用 SSL。他们有相同的 API,当使用 SSL时 使用的是标准的sockets。

NetClient调用setSSL(true) 函数启用 SSL。

客户端信任配置

在客户端,如果trustALl设置为 true,客户端将信任所有的服务器证书。连接仍将被加密,但这种模式是易受攻击的。请谨慎使用。默认值为 false。

  1. NetClientOptions options = new NetClientOptions().
  2. setSsl(true).
  3. setTrustAll(true);
  4. NetClient client = vertx.createNetClient(options);

如果未设置trustAll,客户端必须配置trust store 和应该包含该客户端信任的服务器证书。

同服务器配置,配置客户端信任可以分几个方面:

第一种方法是通过指定包含证书授权 Java trust-store 的位置。

这只是标准 Java 密钥库,密钥存储与服务器端相同。由 jks options 使用函数path设置的客户端trust-store位置。如果服务器不是客户端信任存储区中的连接过程中提供的证书,则连接尝试不会成功。

  1. NetClientOptions options = new NetClientOptions().
  2. setSsl(true).
  3. setTrustStoreOptions(
  4. new JksOptions().
  5. setPath("/path/to/your/truststore.jks").
  6. setPassword("password-of-your-truststore")
  7. );
  8. NetClient client = vertx.createNetClient(options);

此外支持缓冲区配置:

  1. Buffer myTrustStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/truststore.jks");
  2. NetClientOptions options = new NetClientOptions().
  3. setSsl(true).
  4. setTrustStoreOptions(
  5. new JksOptions().
  6. setValue(myTrustStoreAsABuffer).
  7. setPassword("password-of-your-truststore")
  8. );
  9. NetClient client = vertx.createNetClient(options);

还可以以类似 JKS 方式 PKCS #12 格式 (http://en.wikipedia.org/wiki/PKCS_12) trust 存储加载密钥/证书,通常具有.pfx或.p12扩展名:

  1. NetClientOptions options = new NetClientOptions().
  2. setSsl(true).
  3. setPfxTrustOptions(
  4. new PfxOptions().
  5. setPath("/path/to/your/truststore.pfx").
  6. setPassword("password-of-your-truststore")
  7. );
  8. NetClient client = vertx.createNetClient(options);

此外支持缓冲区配置:

  1. Buffer myTrustStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/truststore.pfx");
  2. NetClientOptions options = new NetClientOptions().
  3. setSsl(true).
  4. setPfxTrustOptions(
  5. new PfxOptions().
  6. setValue(myTrustStoreAsABuffer).
  7. setPassword("password-of-your-truststore")
  8. );
  9. NetClient client = vertx.createNetClient(options);

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

  1. NetClientOptions options = new NetClientOptions().
  2. setSsl(true).
  3. setPemTrustOptions(
  4. new PemTrustOptions().
  5. addCertPath("/path/to/your/ca-cert.pem")
  6. );
  7. NetClient client = vertx.createNetClient(options);

此外支持缓冲区配置:

  1. Buffer myTrustStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/ca-cert.pem");
  2. NetClientOptions options = new NetClientOptions().
  3. setSsl(true).
  4. setPemTrustOptions(
  5. new PemTrustOptions().
  6. addCertValue(myTrustStoreAsABuffer)
  7. );
  8. NetClient client = vertx.createNetClient(options);
为客户端指定密钥/证书

如果服务器要求客户端身份验证,然后连接时,客户端必须向服务器提交它自己的证书。客户端可以配置几个方面:

第一种方法是通过指定 Java 密钥库包含密钥和证书的位置。这是只是常规 Java 的密钥存储库。客户端密钥库位置是通过使用函数pathjks options设置.

  1. NetClientOptions options = new NetClientOptions().setSsl(true).setKeyStoreOptions(
  2. new JksOptions().
  3. setPath("/path/to/your/client-keystore.jks").
  4. setPassword("password-of-your-keystore")
  5. );
  6. NetClient client = vertx.createNetClient(options);

此外支持缓冲区配置:

  1. Buffer myKeyStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/client-keystore.jks");
  2. JksOptions jksOptions = new JksOptions().
  3. setValue(myKeyStoreAsABuffer).
  4. setPassword("password-of-your-keystore");
  5. NetClientOptions options = new NetClientOptions().
  6. setSsl(true).
  7. setKeyStoreOptions(jksOptions);
  8. NetClient client = vertx.createNetClient(options);

还可以以类似 JKS 方式 PKCS #12 格式 (http://en.wikipedia.org/wiki/PKCS_12) trust 存储加载密钥/证书,通常具有.pfx或.p12扩展名:

  1. NetClientOptions options = new NetClientOptions().setSsl(true).setPfxKeyCertOptions(
  2. new PfxOptions().
  3. setPath("/path/to/your/client-keystore.pfx").
  4. setPassword("password-of-your-keystore")
  5. );
  6. NetClient client = vertx.createNetClient(options);

此外支持缓冲区配置:

  1. Buffer myKeyStoreAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/client-keystore.pfx");
  2. PfxOptions pfxOptions = new PfxOptions().
  3. setValue(myKeyStoreAsABuffer).
  4. setPassword("password-of-your-keystore");
  5. NetClientOptions options = new NetClientOptions().
  6. setSsl(true).
  7. setPfxKeyCertOptions(pfxOptions);
  8. NetClient client = vertx.createNetClient(options);

另一种方式,分别使用.pem文件提供服务器私钥和证书。

  1. NetClientOptions options = new NetClientOptions().setSsl(true).setPemKeyCertOptions(
  2. new PemKeyCertOptions().
  3. setKeyPath("/path/to/your/client-key.pem").
  4. setCertPath("/path/to/your/client-cert.pem")
  5. );
  6. NetClient client = vertx.createNetClient(options);

此外支持缓冲区配置:

  1. Buffer myKeyAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/client-key.pem");
  2. Buffer myCertAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/client-cert.pem");
  3. PemKeyCertOptions pemOptions = new PemKeyCertOptions().
  4. setKeyValue(myKeyAsABuffer).
  5. setCertValue(myCertAsABuffer);
  6. NetClientOptions options = new NetClientOptions().
  7. setSsl(true).
  8. setPemKeyCertOptions(pemOptions);
  9. NetClient client = vertx.createNetClient(options);

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

吊销认证授权

被吊销的证书不再应信任,信任可以配置为使用证书吊销列表 (CRL)。crlPath配置要使用的 crl 列表:

  1. NetClientOptions options = new NetClientOptions().
  2. setSsl(true).
  3. setTrustStoreOptions(trustOptions).
  4. addCrlPath("/path/to/your/crl.pem");
  5. NetClient client = vertx.createNetClient(options);

此外支持缓冲区配置:

  1. Buffer myCrlAsABuffer = vertx.fileSystem().readFileBlocking("/path/to/your/crl.pem");
  2. NetClientOptions options = new NetClientOptions().
  3. setSsl(true).
  4. setTrustStoreOptions(trustOptions).
  5. addCrlValue(myCrlAsABuffer);
  6. NetClient client = vertx.createNetClient(options);
配置加密套件

默认情况下,TLS配置将使用JVM运行Vert.x.的加密套件这种密码套件可以用一组启用密码进行配置:

  1. NetServerOptions options = new NetServerOptions().
  2. setSsl(true).
  3. setKeyStoreOptions(keyStoreOptions).
  4. addEnabledCipherSuite("ECDHE-RSA-AES128-GCM-SHA256").
  5. addEnabledCipherSuite("ECDHE-ECDSA-AES128-GCM-SHA256").
  6. addEnabledCipherSuite("ECDHE-RSA-AES256-GCM-SHA384").
  7. addEnabledCipherSuite("CDHE-ECDSA-AES256-GCM-SHA384");
  8. NetServer server = vertx.createNetServer(options);

加密套件可以在NetServerOptions或NetClientOptions配置中指定。