2020年8月25日 星期二

android 用 kotlin coroutine 語法測試 Socket

以往使用 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'
     }


沒有留言:

張貼留言

使用 pcie 轉接器連接 nvme SSD

之前 AM4 主機板使用 pcie ssd, 但主機板故障了沒辦法上網, 只好翻出以前買的 FM2 舊主機板, 想辦法讓老主機復活, 但舊主機板沒有 nvme 的界面, 因此上網買了 pcie 轉接器用來連接 nvme ssd, 遺憾的是 grub2 bootloader 無法識...