關(guān)于Android的Socket編程

在一些大廠中,為了使網(wǎng)絡(luò)操作比較靈活的,通常會采用Socket編程,我也是如此,目前公司要求使用socket進行簡單的請求協(xié)議的封裝和socket的一些基本使用,我在這里分享一下心得。

首先,我們需要了解一下socket是什么東西。Socket中文名字套接字是屬于網(wǎng)絡(luò)請求中比較底層的操作,利用socket發(fā)送請求都是直接操作流數(shù)據(jù)(inputSteam,outputSteam)。說白了就是比較底層,連請求協(xié)議都沒有封裝的一種前后端交互方式。

那么了解了Socket是什么之后,接下來我來說一下客戶端對于Socket的使用流程:

step 1.創(chuàng)建Socket實例

step 2.判斷是否連接成功

step 3.獲取輸出流(outputSteam)

step 4.獲取輸入流(inputSteam)

step 5.釋放資源

上面的步驟執(zhí)行完之后,就完成了一個簡單的網(wǎng)絡(luò)請求的操作了,下面我直接用代碼來實現(xiàn)上面的步驟(例子用kotlin來實現(xiàn)):

val socket = Socket("www.baidu.com",80)

if (socket.isConnected) {

? ? val butterWriter= BufferedWriter(OutputStreamWriter(socket.getOutputStream()))? ? ? ? bufferWriter.write("需要發(fā)送到目標主機的內(nèi)容")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????bufferWriter.flush()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? val bufferedReader? = BufferedReader(InputStreamReader(socket.getInputStream()))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//這里開始讀取信息流 就不過多的寫了

? ? //最后記得釋放資源

? ? socket.close()

}

上面這種是最簡的寫法,但是會發(fā)現(xiàn)一個問題,首先socket的連接是耗時的,如果不在同一個線程中操作,很可能會出現(xiàn)if中的代碼不執(zhí)行,原因就是socket咩有初始化完成,但是我查看socket的文檔發(fā)現(xiàn)socket好像并沒有類似的回調(diào),所以我自己用笨方法寫了一個:

fun setConnectedListener(listener: () -> Unit) {? ? ? ? ? ? ? ? ????GlobalScope.launch(Dispatchers.IO) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????while (socket?.isConnected == false) { }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????withContext(Dispatchers.Main) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????listener.invoke()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

這樣做雖然比較笨,但是用來很好用,也解決了連接成功無監(jiān)聽的問題了。

就先寫到這里吧,之后有什么問題,會及時更新的、

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容