Vert.x TCP服务器
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 } } });