什么是Vert.X
Vert.X是一个异步响应式框架,基于Netty实现。
- 一个名为 vertx-core 的 core 项目提供了用于异步编程、非阻塞 I/O、流式传输以及方便地访问 TCP、UDP、DNS、HTTP 或 WebSockets 等网络协议的 API。
导入依赖
导入vertx tcp
所需依赖
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>4.4.0</version>
</dependency>
<!-- 其他工具类依赖-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
使用Vertx 创建TcpServer
不重要的实体类 可以自己定义
package com.example.socketdemo.socket3;
import lombok.Data;
@Data
public class Biz5gSetting {
/** 序列号 */
private Long id;
/**
* 心跳包
*/
private String heartbeatPackage;
/**
* 注册包
*/
private String registerPackage;
/** 串口发送请求后等待时间(毫秒) */
private String waitTime;
/** 发送请求间隔时间(毫秒) */
private String sendInterval;
/** TCP连接ip地址 */
private String ip;
/** TCP连接端口号 */
private Integer port;
/**
* 启用状态 0 未启用 1启用
*/
private Integer enableState;
}
TcpServe
package com.example.socketdemo.socket3;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import com.google.common.collect.Lists;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetServer;
import io.vertx.core.net.NetServerOptions;
import lombok.extern.slf4j.Slf4j;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.List;
@Slf4j
public class VertxTCPServer extends AbstractVerticle {
private final Biz5gSetting biz5gSetting;
public VertxTCPServer(Biz5gSetting biz5gSetting) {
this.biz5gSetting = biz5gSetting;
}
@Override
public void start() {
NetServerOptions netServerOptions = new NetServerOptions().setPort(biz5gSetting.getPort()).setHost(biz5gSetting.getIp());
// 创建TCP服务器
NetServer server = vertx.createNetServer(netServerOptions);
// 处理连接请求
server.connectHandler(socket -> {
socket.handler(buffer -> {
// 在这里应该解析报文,封装为协议对象,并找到响应的处理类,得到处理结果,并响应
System.out.println("接收到的数据为:" + buffer.toString(CharsetUtil.CHARSET_GBK) + " " + LocalDateTime.now());
String heartStr = HexUtil.encodeHexStr(buffer.toString(CharsetUtil.CHARSET_GBK).getBytes(CharsetUtil.CHARSET_GBK)).toUpperCase();
System.out.println("接收到的数据为 -HEX:" + HexUtil.encodeHexStr(buffer.toString(CharsetUtil.CHARSET_GBK).getBytes(CharsetUtil.CHARSET_GBK)).toUpperCase());
// 收到客户端消息后回复客户端信息
socket.write(Buffer.buffer("Hello Vertx from Server!"));
});
// 创建服务端发送消息定时器
long id = vertx.setPeriodic(5000, res -> {
log.info(String.format("%s-%s-%s", biz5gSetting.getIp(), biz5gSetting.getPort(), "开始发送消息"));
socket.write(Buffer.buffer("Hello Vertx from Server!......" + String.format("%s-%s-%s", biz5gSetting.getIp(), biz5gSetting.getPort(), "1234")), ar -> {
if (ar.succeeded()) {
System.out.println(String.format("%s-%s-%s", biz5gSetting.getIp(), biz5gSetting.getPort(), "开始发送消息") + "写入数据成功!");
} else {
System.err.println(String.format("%s-%s-%s", biz5gSetting.getIp(), biz5gSetting.getPort(), "开始发送消息") + "写入数据失败!");
}
});
});
// 监听客户端的退出连接
socket.closeHandler(close -> {
System.out.println("客户端退出连接" + biz5gSetting.getIp() + ":" + biz5gSetting.getPort());
// 取消定时器 不再向退出连接的客户端发送信息
vertx.cancelTimer(id);
});
});
// 监听端口
server.listen(biz5gSetting.getPort(), biz5gSetting.getIp(), res -> {
if (res.succeeded()) {
System.out.println(biz5gSetting.getPort() + " 服务器启动成功");
}
});
}
public static void main(String[] args) {
Biz5gSetting biz5gSetting1 = new Biz5gSetting();
biz5gSetting1.setIp("192.168.2.141");
biz5gSetting1.setPort(10123);
biz5gSetting1.setHeartbeatPackage("BFC6B4F3D6D0CCEC3547CDA8D1B631");
Biz5gSetting biz5gSetting2 = new Biz5gSetting();
biz5gSetting2.setIp("192.168.2.141");
biz5gSetting2.setPort(10124);
biz5gSetting2.setHeartbeatPackage("BFC6B4F3D6D0CCEC3547CDA8D1B632");
Biz5gSetting biz5gSetting3 = new Biz5gSetting();
biz5gSetting3.setIp("192.168.2.141");
biz5gSetting3.setPort(10125);
biz5gSetting3.setHeartbeatPackage("BFC6B4F3D6D0CCEC3547CDA8D1B633");
List<Biz5gSetting> list = Lists.newArrayList();
list.add(biz5gSetting1);
list.add(biz5gSetting2);
list.add(biz5gSetting3);
for (Biz5gSetting biz5gSetting : list) {
Vertx.vertx().deployVerticle(new VertxTCPServer(biz5gSetting));
}
}
}
tcpClient
package com.example.socketdemo.socket1;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetClient;
import io.vertx.core.net.NetClientOptions;
import io.vertx.core.net.NetSocket;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TcpClient extends AbstractVerticle {
@Override
public void start(Future<Void> startFuture) throws Exception {
NetClientOptions options = new NetClientOptions().setConnectTimeout(10000);
NetClient client = vertx.createNetClient(options);
client.connect(9091, "192.168.124.23", res -> {
if (res.succeeded()) {
log.info("tcpClient 连接成功====》");
NetSocket socket = res.result();
socket.handler(buffer -> {
System.out.println(buffer.toString());
socket.write(Buffer.buffer("tcpClient send ====> Hello Vertx from Server!"));
})
;
} else {
log.error("连接失败 {}", res.cause().getMessage());
}
});
}
public static void main(String[] args) {
Vertx.vertx().deployVerticle(new TcpClient());
}
}