Android Netty使用(Kotlin+RxKotlin版)

之前写过一篇关于 Android Socket连接的博客,
当时是采用service的方式,自己在Service中创建Socket并且自己维护线程,线程切换起来很是麻烦,使得service中的代码看起来很臃肿。
后来炒菜机需要进行更新,正好当时已经开始用kotlin开发了,并且了解了一下比较出名的Netty,就把代码重构了。关于Netty的优点网上有很多介绍,这里就不赘述了。
新版本的socket客户端直接通过一个单例方式来实现,通过Rxjava的方式解决回调和线程切换的问题,使用起来代码简洁很多。

话不多说,先上图

在这里插入图片描述

大概就是这样,关于乱码的自己转一下就好了。这里只是个示例。
下面我们先来把NettyClient实现一下

首先下载 Netty的jar包(demo中也有jar文件,可以直接用,文章末尾会放出demo),下载地址,导入到项目中,并且添加RxKotlin和RxAndroid相关依赖。

如下
在这里插入图片描述

导入jar包和依赖后我们就可以编写我们的NettyClient类了,代码如下,我们一般要有连接,发送,断开,重连这几个方法,如果还需要其他方法,自己再加。


/**
 * @description: Netty客户端
 * @author : yzq
 * @date   : 2018/11/23
 * @time   : 14:24
 *
 */

class NettyClient {


    /*是否连接*/
    private var isConnect = false

    /*伴生对象*/
    companion object {
        var instance = NettyClient()
    }


    private lateinit var group: NioEventLoopGroup

    private lateinit var bootstrap: Bootstrap

    private var channel: Channel? = null


    /*连接*/
    fun connect(ip: String, port: String): Observable<Boolean> {

        return Observable.create<Boolean>({
            group = NioEventLoopGroup()
            bootstrap = Bootstrap()
                .remoteAddress(ip, port.toInt())
                .group(group)
                .channel(NioSocketChannel::class.java)
                .option(ChannelOption.SO_KEEPALIVE, true)
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
                .handler(object : ChannelInitializer<SocketChannel>() {
                    override fun initChannel(sc: SocketChannel) {
                        var pipeline = sc.pipeline()
                        pipeline.addLast(LoggingHandler(LogLevel.INFO))

                        /*byte类型编解码*/
//                        pipeline.addLast(ByteArrayDecoder())
//                        pipeline.addLast(ByteArrayEncoder())

                        /*string类型编解码*/
                        pipeline.addLast(StringDecoder())
                        pipeline.addLast(StringEncoder())
                    }
                })


            try {
                channel = bootstrap.connect().sync().channel()
                it.onNext(channel!!.isActive)
                isConnect = channel!!.isActive
            } catch (e: Exception) {
                it.onNext(false)
                isConnect = false
            }
        }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())


    }


    /*发送命令*/
    fun sendOrder(order: String): Observable<Boolean> {


        return Observable.create<Boolean>({ emitter ->

            if (isConnect) {
                channel?.writeAndFlush(order)?.addListener {
                    emitter.onNext(it.isSuccess)
                }
            } else {
                emitter.onNext(false)
            }


        }).subscribeOn(Schedulers.io())//这里注意要在工作线程发送
            .observeOn(AndroidSchedulers.mainThread())


    }

    /*是否连接*/
    fun isConnect(): Boolean {
        return isConnect
    }

    /*重连*/
    fun reConnect(ip: String, port: String): Observable<Boolean> {
        disConnect()
        return connect(ip, port)

    }


    /*关闭连接*/
    fun disConnect() {

        isConnect = false
        group.shutdownGracefully()


    }


}

好了,NettyClient这样就写完了。我们来使用一下,布局文件很简单,我们直接来看Activity中的代码。

package com.yzq.nettydemo

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.text.TextUtils
import android.widget.Toast
import com.yzq.nettydemo.netty.NettyClient
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        /*连接按钮*/
        connectBtn.setOnClickListener {
            connectSocket()

        }

        /*发送按钮*/
        sendBtn.setOnClickListener {

            sendMsg()
        }

    }


    /*处理连接*/
    fun connectSocket() {

        /*拿到输入的ip和port*/

        var ip = ipEt.text.toString().trim()
        var port = portEt.text.toString().trim()


        /*这里可以对ip地址和端口号进行一下正则校验  这里我就不校验了*/

        if (TextUtils.isEmpty(ip) or TextUtils.isEmpty(port)) {
            showToast("ip和端口号不能为空,请检查")

            return
        }



        NettyClient.instance.connect(ip, port)
            .subscribe {

                if (it) {
                    showToast("已连接")
                } else {
                    showToast("连接失败")
                }
            }

    }


    /*处理发送*/
    private fun sendMsg() {

        var msg = contentEt.text.toString().trim()
        if (TextUtils.isEmpty(msg)) {
            showToast("您没有输入内容,请检查")

            return
        }

        NettyClient.instance.sendOrder(msg)
            .subscribe {

                if (it) {

                    /*发送成功*/
                    showToast("发送成功")
                } else {

                    showToast("发送失败")

                }
            }


    }

    fun showToast(msg: String) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
    }


    override fun onDestroy() {
        super.onDestroy()

        /*关闭连接  这里根据自己需求使用*/
        NettyClient.instance.disConnect()
    }
}

之前的版本我们是通过EventBus来进行通信的,新版本我们直接通过观察者模式来实现异步操作,使用起来方便很多。

下面是Demo
Netty Demo


如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
IM(即时通讯)服务是一种非常流行的应用程序,它可以使用户在实时聊天中进行文字、图片、音频和视频交流。Netty是一个高性能、异步、事件驱动的网络应用程序框架,它提供了一种简单、快速、可扩展和高效的方式来开发网络应用程序。Kotlin是一种现代的编程语言,它可以帮助开发人员编写更简洁、更易于维护的代码。因此,使用Kotlin Netty开发IM服务是一种非常流行的选择。 以下是使用Kotlin Netty开发IM服务的基本步骤: 1. 安装KotlinNetty 在开始开发之前,您需要安装KotlinNetty。您可以从官方网站下载Kotlin,并通过Maven或Gradle添加Netty依赖项。 2. 设计IM服务 在开始编写代码之前,您需要设计IM服务的架构。您需要考虑以下几个方面: - 消息传递机制:您需要确定如何处理和传递消息。您可以使用长轮询、WebSocket或轻量级消息队列等机制。 - 数据库:您需要确定如何存储用户信息和消息历史记录。您可以使用关系数据库或NoSQL数据库。 - 安全性:您需要考虑如何保护用户数据和通信。您可以使用SSL/TLS协议、身份验证和授权机制。 3. 编写服务器代码 接下来,您需要编写IM服务器代码。以下是一些常见的步骤: - 创建Netty服务器:您需要创建一个Netty服务器,并设置监听端口和处理程序。 - 处理连接:当客户端连接到服务器时,您需要创建一个新的连接对象。 - 处理消息:当客户端发送消息时,您需要处理消息并将其转发给其他客户端。 - 处理断开连接:当客户端断开连接时,您需要清除与该客户端相关的所有信息。 4. 编写客户端代码 您还需要编写IM客户端代码。以下是一些常见的步骤: - 创建连接:您需要创建一个到服务器的连接,并通过连接发送和接收消息。 - 处理消息:当服务器发送消息时,您需要处理消息并显示在客户端上。 - 处理断开连接:当服务器断开连接时,您需要提示用户并关闭应用程序。 5. 测试IM服务 最后,您需要测试您的IM服务。您可以使用多个客户端测试消息传递和连接稳定性。您还可以使用性能测试工具测试服务器的性能。 总之,使用Kotlin Netty开发IM服务是一种非常流行的选择。您需要设计IM服务的架构,编写服务器代码和客户端代码,并进行测试。使用KotlinNetty可以帮助您编写更简洁、更易于维护的代码,并提供高性能、可扩展和高效的网络应用程序框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喻志强(Xeon)

码字不易,鼓励随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值