Vert.x TCP服务器

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

Vert.x随附有一个TCP服务器,可轻松在应用程序中创建TCP服务器。我们可以根据需要创建一个或者多个TCP服务器。在本教程中,我将研究如何从垂直内部创建TCP服务器以及如何处理传入的连接和数据。

创建一个TCP服务器

通过调用" Vertx"对象上的" createNetServer()"方法来创建Vert.x TCP服务器。看起来是这样的:

NetServer server = vertx.createNetServer();

我们通常会在一个垂直内部创建一个TCP服务器。这是从垂直内部创建Vert.x TCP服务器的方法:

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

public class VertxTcpServerVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        NetServer server = vertx.createNetServer();
    }
}

启动TCP服务器

一旦创建了TCP服务器,就可以使用它的listen()方法启动它。这是启动TCP服务器的外观:

public class VertxTcpServerVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        NetServer server = vertx.createNetServer();

        server.listen(10000);
    }
}

本示例将启动服务器,并指示其在TCP端口10.000上进行侦听。

NetServer类包含listen()方法的更多版本,为我们提供启动TCP服务器的不同选项。

在TCP服务器上设置连接处理程序

为了处理传入的TCP连接,我们需要在TCP服务器上设置连接处理程序。通常,这是在启动TCP服务器之前完成的。这是一个Vert.x TCP服务器连接处理程序示例:

public class VertxTcpServerVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        NetServer server = vertx.createNetServer();

        server.connectHandler(new Handler<NetSocket>() {

            @Override
            public void handle(NetSocket netSocket) {
                System.out.println("Incoming connection!");
            }
        });
    
        server.listen(10000);
    }
}

每当TCP服务器的客户端创建新的TCP连接时,都会调用connect处理程序的handle()方法。作为参数传递给handle()方法的NetSocket对象可以访问传入的连接(套接字等)。

从套接字读取数据

为了从传入的连接中读取数据,我们需要在NetSocket对象上为连接设置一个处理程序。这是完成的方式:

public class VertxTcpServerVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        NetServer server = vertx.createNetServer();

        server.connectHandler(new Handler<NetSocket>() {

            @Override
            public void handle(NetSocket netSocket) {
                System.out.println("Incoming connection!");

                netSocket.handler(new Handler<Buffer>() {

                    @Override
                    public void handle(Buffer buffer) {
                        System.out.println("incoming data: "+buffer.length());

                        buffer.getString(0,buffer.length());
                    }
                });
            }
        });

        server.listen(10000);
    }
}

将数据写入套接字

处理完传入的数据后,我们可能需要将响应写回到客户端。我们可以通过传递给连接处理程序的handle()方法的NetSocket实例来实现。这是一个通过NetSocket将数据写回到客户端的例子:

public class VertxTcpServerVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        NetServer server = vertx.createNetServer();

        server.connectHandler(new Handler<NetSocket>() {

            @Override
            public void handle(NetSocket netSocket) {
                System.out.println("Incoming connection!");

                netSocket.handler(new Handler<Buffer>() {

                    @Override
                    public void handle(Buffer inBuffer) {
                        System.out.println("incoming data: " + inBuffer.length());

                        String data =
                            inBuffer.getString(0, inBuffer.length());

                        Buffer outBuffer = Buffer.buffer();
                        outBuffer.appendString("response...");

                        netSocket.write(outBuffer);
                    }
                });
            }
        });
        server.listen(10000);
    }
}

NetSocket方法的write方法是异步的。因此,它立即返回。数据将在以后写入底层套接字。

NetSocket类包含更多版本的write()方法,使我们可以编写例如直接将一个String插入套接字,而不使用Buffer。有关更多详细信息,请参见Vert.x JavaDoc。

关闭TCP服务器

完成TCP服务器后,可以使用它的close()方法关闭它。这是关闭Vert.x TCP服务器的样子:

server.close();

关闭TCP服务器是异步操作,因此close()方法可能在TCP服务器实际关闭之前退出。如果需要在TCP服务器关闭时收到通知,则可以将Handler传递给close()方法。 TCP服务器完全关闭时,将调用此处理程序。看起来是这样的:

server.close(new Handler<AsyncResult<Void>>() {
    @Override
    public void handle(AsyncResult result) {
        if(result.succeeded()){
            //TCP server fully closed
        }
    }
});