Vert.x TCP客户端

时间:2020-01-09 10:47:21  来源:igfitidea点击:

Vert.x带有内置的TCP客户端,可轻松创建TCP客户端并以异步模式使用它们。 " Vert.x" TCP客户端类称为" io.vertx.core.net.NetClient"。

创建一个TCP客户端

我们可以通过创建NetClient实例来创建TCP客户端。通过" Vertx"对象的方法" createNetClient()"创建" NetClient"的实例。这是创建" NetClient"实例的方法:

NetClient tcpClient = vertx.createNetClient();

通常,我们将在一个垂直内部创建一个" NetClient"。这是从垂直内部创建Vert.xNetClient的样子:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.net.NetClient;

public class VertxTcpClientVerticle extends AbstractVerticle {

    public void start() {
        NetClient tcpClient = vertx.createNetClient();
    }
}

连接到远程服务器

我们可以通过调用connect()方法连接到远程服务器。这是调用connect()方法的样子:

public class VertxTcpClientVerticle extends AbstractVerticle {

    public void start() {
        NetClient tcpClient = vertx.createNetClient();

        tcpClient.connect(80, "Hyman.com",
            new Handler<AsyncResult<NetSocket>>(){

            @Override
            public void handle(AsyncResult<NetSocket> result) {
                NetSocket socket = result.result();
            }
        });
    }
}

我们传递远程服务器的TCP端口以及域名,以及建立连接时将调用的" Handler"对象。我们可以通过传递给处理程序的handle()方法的AsyncResult实例获取对连接到远程服务器的NetSocket的引用。

写数据

我们可以通过NetSocket``write()方法将数据写入TCP连接。看起来是这样的:

public class VertxTcpClientVerticle extends AbstractVerticle {

    public void start() {
        NetClient tcpClient = vertx.createNetClient();

        tcpClient.connect(80, "Hyman.com",
            new Handler<AsyncResult<NetSocket>>(){

            @Override
            public void handle(AsyncResult<NetSocket> result) {
                NetSocket socket = result.result();

                socket.write("GET / HTTP/1.1\r\nHost: Hyman.com\r\n\r\n");
            }
        });
    }
}

write()方法是异步的,并立即返回。到write()方法返回时,数据可能尚未发送。

Vert.x NetSocket包含更多版本的write()方法,使我们可以编写例如数据的"缓冲区"到" NetSocket"。

读取数据

为了从NetSocket中读取数据,我们需要在NetSocket中注册一个Handler方法。这是在NetSocket上注册Handler的方法:

public class VertxTcpClientVerticle extends AbstractVerticle {

    public void start() {
        NetClient tcpClient = vertx.createNetClient();

        tcpClient.connect(80, "Hyman.com",
            new Handler<AsyncResult<NetSocket>>(){

            @Override
            public void handle(AsyncResult<NetSocket> result) {
                NetSocket socket = result.result();

                socket.write("GET / HTTP/1.1\r\nHost: Hyman.com\r\n\r\n");

                socket.handler(new Handler<Buffer>(){
                    @Override
                    public void handle(Buffer buffer) {
                        System.out.println("Received data: " + buffer.length());

                        System.out.println(buffer.getString(0, buffer.length()));

                    }
                });
            }
        });
    }
}

当从远程服务器接收到数据时,将调用Handler的handle()方法。

关闭TCP连接

一旦使用完TCP客户端,就需要再次关闭它。我们可以通过调用NetClient实例的close()方法来关闭TCP客户端。看起来是这样的:

tcpClient.close();

同样,NetClient的close()方法是异步的,因此底层的TCP连接可能在close()方法返回时尚未关闭。