vertx 入门级tcp编程

什么是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());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值