Android Kotlin语言实现+TCP客户端开发+粘包处理

不喜勿喷,个人不足的地方还有很多,有问题及解决思路的直接在留言方留言,或者私信给我,一起解决问题.

情景:
连接硬件板块,和硬件进行通信

TCP概念性质的知识可以观看别的博客

// 定义一个类来继承协程使整个类拥有协程的上下文.
internal class TransparentTcp : CoroutineScope{
   
	 private val job = Job()
	
    override val coroutineContext: CoroutineContext = IO + job
}

internal 关键字的意义:该变量/类/方法仅在此工程中可见,因为我做这个TCP这个工程最后需要打包为一个SDK,给界面使用,给界面使用的过程中,我不想让他直接操作我的这个TCP工作类,我给他一个代理类,让他对代理类进行操作.他们引入我的SDK之后,该类是可见的,但不可访问,下图就是关键字的意思,
在这里插入图片描述
在这里插入图片描述
以下是需要工作用到的字段

    private val IP = "192.168.xxx.xxx"
    private val PORT = 4028

    private val TCP_CONNETION_TIME = 5000L // TCP重连
    private val TCP_MESSAGE_TIME = 3000L // tcp检测心跳

    /**
     * TCP 超时连接30s 因为TCP有重发机制,所以时间稍微久一点也可以
     */
    private val TCP_CONNECTION_TIMEOUT = 30 * 1000

    private var tempTime = 0L // 临时保存时间

    private var socket: Socket? = null

    private lateinit var socketIn: InputStream

    private lateinit var socketOut: OutputStream

    /**
     * 开始工作协程
     */
    private lateinit var startlaun: Job

    /**
     * 心跳协程
     */
    private var heartLaun: Job? = null

    /**
     * 接收信息协程
     */
    private var readLaun: Job? = null

    /**
     * 发送信息协程
     */
    private var sendLaun: Job? = null

工作协程

 @Suppress("BlockingMethodInNonBlockingContext")
    private fun startConnetion() =
        launch(coroutineContext, CoroutineStart.LAZY) {
   
            // 创建socket
            while (true) {
   
                try {
   
                    socket = Socket()
                    Log.i(TAG, "连接tcp")
                    // 创建 socket连接地址
                    val inetSocketAddress = InetSocketAddress(IP, PORT)
                    // 等待tcp连接成功,连接失败直接抛异常
                    socket?.connect(inetSocketAddress, 30000)
                    socketIn = socket?.getInputStream()!!
                    socketOut = socket?.getOutputStream()!!
                    heartLaun = heartPackage()
                    sendLaun = sendMessageTcp()
                    readLaun = readTcpData()
                    // 先暂停5s,如果接收到tcp的消息(因为接收协程已经开启[readLaun]),则会继续往下阻塞
                    delay(5000)
                    // 阻塞当前的协程继续循环,等待要是出意外或者超时则会重新遍历继续重连tcp
                    async {
   
                        while (true) {
   
                            // 重复检测当前的时间是否超时
                            delay(1000
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值