先看下效果:
然後瞭解下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