以往使用 tcp Socket 通信免不了要用 Thread 處理非同步的工作(async task), 但有了 couroutines 程式庫後就容易多了, 但要注意的是 Android 不能在主程(MainThread 又稱為 UI Thread)使用網路的功能,這時就要用派任工 Dispatchers.IO 分配到後台去執行, Java 有內建 Socket 及 ServerSocket 兩種類型的程式庫, 若要當 tcp 伺服器時用 ServerSocket , 一般的 tcp client 就是 Socket 類型:
import kotlinx.coroutines.*
// import java.net.ServerSocket // tcp server class
import java.net.Socket // tcp client class
private suspend fun testSocket() {
try {
val socket = Socket("www.google.com.tw", 443) // TCP socket for client
val connect = socket.isConnected()
println("$socket : $connect")
socket.close()
} catch (e: Exception) {
println("Socket Error@testSocket: $e")
}
}
主程序用 GlobalScope.launch 直接發動 coroutines:
GlobalScope.launch(Dispatchers.IO) {
launch {
testSocket()
}
// ...
}
備註:
AndroidManifest.xml 添加網路授權:
<uses-permission android:name="android.permission.INTERNET" />
build.gradle 添加 kotlin coroutines 程式庫:
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
}
沒有留言:
張貼留言