在一些大廠中,為了使網(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)聽的問題了。
就先寫到這里吧,之后有什么問題,會及時更新的、