基于Kotlin实现一个简单的TCP自定义协议(1),2024年最新hashmap遍历

本文介绍了如何使用Kotlin构建一个简单的TCP自定义协议,包括定义Packet类,心跳Packet HeartBeatPacket,以及PacketManager的encode和decode方法。此外,还展示了TCP服务端的启动过程,涉及ServerIdleHandler进行心跳超时处理和MagicNumValidator进行报文的魔数校验。
摘要由CSDN通过智能技术生成

abstract val serializeMethod:Byte // 序列化方式
abstract val command:Byte // Watcher 跟 App 相互通讯的指令
}

有多少个指令就需要定义多少个 Packet,下面以心跳的 Packet 为例,定义一个 HeartBeatPacket:

data class HeartBeatPacket(var msg:String = “ping”,
override val serializeMethod: Byte = Serialize.JSON,
override val command: Byte = Commands.HEART_BEAT) : Packet() {
}

HeartBeatPacket 是由 TCP 客户端发起,由 TCP 服务端接收并返回给客户端。

每个 Packet 类都包含了该 Packet 所使用的序列化方式。

/**

  • 序列化方式的常量列表
    */
    interface Serialize {

companion object {

const val JSON: Byte = 0
}
}

每个 Packet 也包含了其对应的 command。下面是 Commands 是指令集,支持256个指令。

/**

  • 指令集,支持从 -128 到 127 总共 256 个指令
    */
    interface Commands {

companion object {

/**

  • 心跳包
    */
    const val HEART_BEAT: Byte = 0

/**

  • 登录(App 需要告诉 Watcher :cameraPosition 的位置)
    */
    const val LOGIN: Byte = 1


}
}

由于使用自定义的协议,必须要有对报文的 encode、decode,PacketManager 负责这些事情。
encode 时按照协议的结构进行组装报文,同理 decode 是其逆向的过程。

/**

  • 报文的管理类,对报文进行 encode、decode
    */
    object PacketManager {

fun encode(packet: Packet):ByteBuf = encode(ByteBufAllocator.DEFAULT, packet)

fun encode(alloc:ByteBufAllocator, packet: Packet) = encode(alloc.ioBuffer(), packet)

fun encode(buf: ByteBuf, packet: Packet): ByteBuf {

val serializer = SerializerFactory.getSerializer(packet.serializeMethod)

val bytes: ByteArray = serializer.serialize(packet)

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值