最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實現(xiàn)socket通信統(tǒng)一接口的方法

 更新時間:2021年12月11日 11:31:17   作者:軒愷  
這篇文章主要介紹了Android實現(xiàn)socket通信統(tǒng)一接口?,實現(xiàn)了統(tǒng)一接口之后確實可以使后續(xù)修改實現(xiàn)更加方便,程序結(jié)構(gòu)也更加工程化,需要的朋友可以參考下

Android實現(xiàn)socket通信統(tǒng)一接口,統(tǒng)一接口之后可以在不需要大量修改應用層代碼的情況下,使用與當前功能類似但是底層實現(xiàn)不同的功能,以實現(xiàn)的UDP與TCP兩種通信方式的接口為例。

UDP通信與TCP通信的實現(xiàn)

UDP通信

我們在使用UDP通信方式時,我們會這樣實現(xiàn)

//設(shè)置socket
val socket = DatagramSocket()
val serverPort = 9000
val address = InetAddress.getByName("ip地址")
//發(fā)送
val bytes = message.toByteArray(Charsets.UTF_8)
val len = bytes.size
val sendPacket = DatagramPacket(bytes, len, address, serverPort)
socket.send(sendPacket)
//接收
socket.receive(receivePacket)
val data = String(receivePacket.data, Charsets.UTF_8)
//處理接收到的數(shù)據(jù)
//關(guān)閉連接
socket.close()

TCP客戶端通信

我們在使用TCP客戶端通信方式時,我們會這樣實現(xiàn)

//設(shè)置socket
val serverPort = 9000
val address = InetAddress.getByName("ip地址")
val socket = Socket(address, serverPort)
val input = socket.getInputStream()
val output = socket.getOutputStream()
//發(fā)送
output.write(message.toByteArray(Charsets.UTF_8))
//接收
val len = input.read(receive)
val data = String(receive, 0, len, Charsets.UTF_8)
//處理接收到的數(shù)據(jù)
//關(guān)閉連接
socket.close()

這樣的話,如果我們需要將應用層中的UDP連接轉(zhuǎn)換為TCP連接,就要大量地修改代碼。

使用統(tǒng)一接口

統(tǒng)一接口之后可以在不需要大量修改應用層代碼的情況下,使用與當前功能類似但是底層實現(xiàn)不同的功能。

以之前我們實現(xiàn)的UDP與TCP兩種通信方式為例,要將其中任意一種轉(zhuǎn)換為另一種時,又或者有新的通信方式需要采用,每次都繁復地修改應用層代碼很明顯不是個好主意。

我們可以簡單地分析一下這兩種通信方式,他們都要經(jīng)歷初始化(設(shè)置socket)-> 發(fā)送或者接收 -> 處理數(shù)據(jù) -> 關(guān)閉連接,那我們就可以將這些他們共有的部分抽象出來給應用層使用。

定義接口

新建一個Communicate.kt文件,實現(xiàn)Communicate接口

interface Communicate {
    /**
     * 通信端口
     */
    var serverPort: Int
    /**
     * 通信地址
     */
    var address: String
    /**
     * 輸入編碼
     */
    var inCharset: Charset
    /**
     * 輸出編碼
     */
    var outCharset: Charset
    /**
     * 發(fā)送數(shù)據(jù)
     * @param message 數(shù)據(jù)內(nèi)容
     */
    fun send(message: String)
    /**
     * 開始接收數(shù)據(jù)
     * @param onReceive 處理接收到的數(shù)據(jù)的函數(shù),函數(shù)返回值為是否繼續(xù)接收消息.
     * 請不要在函數(shù)中使用stopReceive()函數(shù)停止接收數(shù)據(jù),這不會起作用。
     * @return 是否開啟成功
     */
    fun startReceive(onReceive: OnReceiveFunc): Boolean
    /**
     * 停止接收數(shù)據(jù)
     */
    fun stopReceive()
    /**
     * 開啟通信,用于TCP建立連接
     * @return 是否開啟成功
     */
    fun open(): Boolean
    /**
     * 關(guān)閉通信
     */
    fun close()
}

上面的代碼塊中還用到了OnReceiveFunc,這用到了kotlin中的類型映射,類似于c語言中的typedef,下面是OnReceiveFunc的實現(xiàn),他接收一個字符串作為參數(shù),返回一個布爾型變量。

typealias OnReceiveFunc = (String) -> Boolean

在具體使用時利用kotlin的特性,可以直接寫OnReceiveFunc方法體。

communicate.startReceive {
    binding.textView.text = it
    return@startReceive false
}

而在java中的使用方法如下

communicate.startReceive(result -> {
    binding.textView.setText(result);
    return false;
});

注:這里的communicate是一個實現(xiàn)了Communicate接口的通信對象,而我們并沒有關(guān)心到底采用了什么通信方式。

這部分中我們可以使用靜態(tài)方法來讓應用層創(chuàng)建對象(即選擇想要的連接方式)更加方便。

interface Communicate {
 companion object {
     @JvmStatic
     val TCPClient: Communicate
         get() = TCP()
     @JvmStatic
     val UDP: Communicate
         get() = UDP()
 }
 //其他代碼
}

其中用到了@JvmStatic的注解,這讓java調(diào)用Communicate時可以少一層companion

實現(xiàn)接口

我們再實現(xiàn)UDPTCPClient這兩個類,他們都實現(xiàn)了Communicate接口。

我沒有實現(xiàn)TCPServer,已經(jīng)實現(xiàn)的兩種具體實現(xiàn)可以參考我的gitee倉庫

實現(xiàn)應用層

這樣一來在應用層調(diào)用就可以使用同一種風格,比如聲明一個UDP通信對象

private val communicate = Communicate.UDP.apply {
    address = "ip地址"
    serverPort = 9000
    inCharset = Charset.forName("gb2312")
    outCharset = Charset.forName("gb2312")
    open()
}

而聲明一個TCPClient通信對象只需要這樣

private val communicate = Communicate.TCPClient.apply {
    //與UDP完全一樣
}

而調(diào)用部分就更不用說了,完全不需要修改。這樣一來當我們需要修改當前通信方式時只需要將Communicate.UDP改為Communicate.TCPClient,極大地降低了后續(xù)修改的工作量。

總結(jié)

實現(xiàn)了統(tǒng)一接口之后確實可以使后續(xù)修改實現(xiàn)更加方便,程序結(jié)構(gòu)也更加工程化。

到此這篇關(guān)于Android實現(xiàn)socket通信統(tǒng)一接口 的文章就介紹到這了,更多相關(guān)Android socket通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • android TextView不用ScrollViewe也可以滾動的方法

    android TextView不用ScrollViewe也可以滾動的方法

    這篇文章主要介紹了android TextView不用ScrollViewe也可以滾動的方法,很簡單實用的代碼,大家參考使用吧
    2013-11-11
  • Android利用廣播接收器實現(xiàn)自動填充短信驗證碼

    Android利用廣播接收器實現(xiàn)自動填充短信驗證碼

    這篇文章主要為大家詳細介紹了Android利用廣播接收器實現(xiàn)自動填充短信驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android自定義橡皮擦效果

    Android自定義橡皮擦效果

    這篇文章主要為大家詳細介紹了Android自定義橡皮擦效果,橡皮擦擦圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Kotlin標準庫函數(shù)使用分析及介紹

    Kotlin標準庫函數(shù)使用分析及介紹

    Kotlin提供了一個系統(tǒng)庫,是Java庫的增強。其中有很多函數(shù)在適配了Java的類型和方法同時使用Kotlin的語法。其中一些底層的函數(shù) 是使用比較廣泛的
    2022-09-09
  • Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼

    Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼

    這篇文章主要介紹了Android自定義控件之可拖動控制的圓環(huán)控制條實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Android組件初始化三種方式小結(jié)

    Android組件初始化三種方式小結(jié)

    在Android中,組件的初始化通常需要在適當?shù)纳芷诜椒ㄖ羞M行,本文給大家詳細的介紹了初始化的三種方式,文中有詳細的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • 丟失Android系統(tǒng)庫或者Conversion to Dalvik format failed with error 1錯誤的解決方法

    丟失Android系統(tǒng)庫或者Conversion to Dalvik format failed with error

    這篇文章主要介紹了丟失Android系統(tǒng)庫或者Conversion to Dalvik format failed with error 1錯誤的解決方法,分析了Android系統(tǒng)庫丟失及版本問題的處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • Kotlin開發(fā)筆記之委托屬性與區(qū)間(譯)

    Kotlin開發(fā)筆記之委托屬性與區(qū)間(譯)

    最近在學習kotlin,發(fā)現(xiàn)了一些比較重要的知識點,所以下面這篇文章主要給大家介紹了關(guān)于Kotlin開發(fā)筆記之委托屬性與區(qū)間的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • 深入學習Android中的Intent

    深入學習Android中的Intent

    深入學習Android中的Intent,Intent提供了一種通用的消息系統(tǒng),它允許在你的應用程序見傳遞Intent來執(zhí)行動作和產(chǎn)生事件,對Intent感興趣的小伙伴們可以參考一下
    2015-12-12
  • Android 安全加密:對稱加密詳解

    Android 安全加密:對稱加密詳解

    本文主要介紹Android 安全加密對稱加密,這里整理了詳細的資料及介紹凱撒密碼和對稱密碼的資料,有興趣的小伙伴可以參考下
    2016-09-09

最新評論

荃湾区| 出国| 西乡县| 独山县| 上杭县| 西华县| 观塘区| 漠河县| 绥化市| 磐石市| 报价| 皋兰县| 枣强县| 陵水| 府谷县| 兴义市| 桃源县| 哈尔滨市| 承德县| 汾阳市| 和政县| 祥云县| 竹溪县| 满城县| 北海市| 五大连池市| 天峨县| 无锡市| 奉节县| 平原县| 读书| 衡山县| 六安市| 乾安县| 太康县| 永嘉县| 麻江县| 岳西县| 宽甸| 叙永县| 伊宁市|