欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)一接口之后可以在不需要大量修改應(yī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()

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

使用統(tǒng)一接口

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

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

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

定義接口

新建一個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)方法來讓應(yīng)用層創(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)應(yīng)用層

這樣一來在應(yīng)用層調(diào)用就可以使用同一種風(fēng)格,比如聲明一個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)文章

  • Navigation?Bundle實現(xiàn)兩個Fragment參數(shù)傳遞

    Navigation?Bundle實現(xiàn)兩個Fragment參數(shù)傳遞

    這篇文章主要為大家介紹了Navigation?Bundle實現(xiàn)兩個Fragment參數(shù)傳遞,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 用Kotlin打造一個Router的示例代碼

    用Kotlin打造一個Router的示例代碼

    本篇文章主要介紹了用Kotlin打造一個Router的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android仿微信公眾號文章頁面加載進度條

    Android仿微信公眾號文章頁面加載進度條

    這篇文章主要為大家詳細介紹了Android仿微信公眾號文章頁面加載進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android編程實現(xiàn)帶漸變效果的圓角矩形示例

    Android編程實現(xiàn)帶漸變效果的圓角矩形示例

    這篇文章主要介紹了Android編程實現(xiàn)帶漸變效果的圓角矩形,涉及Android界面布局及屬性設(shè)置相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Android仿微博加載長圖滾動查看效果

    Android仿微博加載長圖滾動查看效果

    這篇文章主要為大家詳細介紹了Android仿微博加載長圖滾動查看效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android基于ImageView繪制的開關(guān)按鈕效果示例

    Android基于ImageView繪制的開關(guān)按鈕效果示例

    這篇文章主要介紹了Android基于ImageView繪制的開關(guān)按鈕效果,結(jié)合實例形式分析了Android使用ImageView進行按鈕繪制的界面布局、功能實現(xiàn)及相關(guān)注意事項,需要的朋友可以參考下
    2017-03-03
  • Android開發(fā)中GridView用法示例

    Android開發(fā)中GridView用法示例

    這篇文章主要介紹了Android開發(fā)中GridView用法,簡單說明了GridView控件的功能并結(jié)合實例形式給出了GridView組合圖片顯示的具體功能實現(xiàn)方法與布局操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android獲取位置信息的方法

    Android獲取位置信息的方法

    這篇文章主要為大家詳細介紹了Android獲取位置信息的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android使用ViewPager實現(xiàn)頂部tabbar切換界面

    Android使用ViewPager實現(xiàn)頂部tabbar切換界面

    這篇文章主要為大家詳細介紹了使用ViewPager實現(xiàn)頂部tabbar切換界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android利用ViewPager實現(xiàn)滑動廣告板實例源碼

    Android利用ViewPager實現(xiàn)滑動廣告板實例源碼

    利用ViewPager我們可以做很多事情,從最簡單的導(dǎo)航,到頁面切換菜單等等。ViewPager的功能就是可以使視圖滑動,就像Lanucher左右滑動那樣
    2013-06-06

最新評論