Kotlin簡易聊天室(Java賦值表達式轉爲Kotlin)

先看下效果:
在這裏插入圖片描述

然後瞭解下Java中的賦值表達式轉爲Kotlin吧

while ((len = inputStream.read(buf)) != -1) {} 

轉爲kotlin就是

while (inputStream.read(buf).let { len = it;it != -1 }) {}

進入正題

創建一個ISocket.kt文件


package com.i.mvvmdemo

import java.io.IOException
import java.io.InputStream
import java.io.OutputStream
import java.net.InetAddress
import java.net.ServerSocket
import java.net.Socket
import java.util.*

-----------------------------------服務端----------------------------------

class Server constructor(port: Int) : Thread() {
    private var list: MutableList<Socket> = ArrayList()
    private var server: ServerSocket

    init {
        val inetAddress = InetAddress.getByName("192.168.31.48")
        server = ServerSocket(port, 50, inetAddress)
    }


    override fun run() {
        super.run()
        try {
            while (true) {
                val socket = server.accept()
                val message = socket.inetAddress.hostAddress.toString()
                println("$message == Connected")
                SendMessageToAllUser(message)
                list.add(socket)
                readerThread(socket).start()
            }

        } catch (e: IOException) {
            e.printStackTrace()
        }

    }

    private fun SendMessageToAllUser(message: String) {
        for (socket in list) {
            if (socket != null && socket.isConnected) {
                try {
                    val os = socket.getOutputStream()
                    os.write(message.toByteArray())
                    os.flush()
                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
        }
    }

    inner class readerThread(socket: Socket) : Thread() {
        lateinit var inputStream: InputStream

        init {
            try {
                // 獲取輸入流
                inputStream = socket.getInputStream()
            } catch (e: IOException) {
                e.printStackTrace()
            }

        }

        override fun run() {
            super.run()
            try {
                var inputStream: InputStream = inputStream
                var len = 0
                val buf = ByteArray(1024)
                while (inputStream.read(buf).let { len = it;it != -1 }) {
                    println("Server receives data from client:   " + String(buf, 0, len))
                    SendMessageToAllUser(String(buf, 0, len))
                }
            } catch (e: IOException) {
                e.printStackTrace()
            }

        }
    }
}

-----------------------------------客戶端------------------------------------

class Client constructor(host: String, port: Int) : Thread() {
    var socket: Socket

    init {
        socket = Socket(host, port)
    }

    override fun run() {
        super.run()
        sendMessThread().start()
        super.run()
        try {
            // 讀Sock裏面的數據
            val inputStream = socket.getInputStream()
            val buf = ByteArray(1024)
            var len = 0
            while (inputStream.read(buf).let { len = it;it != -1 }) {
                println(String(buf, 0, len))
            }

        } catch (e: IOException) {
            e.printStackTrace()
        }

    }

    inner class sendMessThread : Thread() {
        override fun run() {
            super.run()
            //寫操作
            var scanner: Scanner? = null
            var os: OutputStream? = null
            try {
                scanner = Scanner(System.`in`)
                os = socket.getOutputStream()
                var input = ""
                do {
                    input = scanner.next()
                    os!!.write("client:$input".toByteArray())
                    os.flush()
                } while (input != "bye")
            } catch (e: IOException) {
                e.printStackTrace()
            }

            scanner?.close()
            try {
                os?.close()
            } catch (e: IOException) {
                e.printStackTrace()
            }

        }
    }
}

--------------------------------------測試----------------------------------

fun main() {
    startServer()
    startClient()
}



fun startServer() {
    Server(6768).start()
}

fun startClient() {
//你電腦本地的ip,端口號隨便設置
    Client("192.168.31.48", 6768).start()
}

由於一個kt文件只能有一個main方法,所以再創建一個kt文件
ClientB.kt

------------------------------測試(開第二個客戶端)-------------------------

fun main(){
    startClient()
}

參考:https://blog.csdn.net/wenzhi20102321/article/details/52620323

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章