簡易kotlin網絡聊天程序


這是一個用Kotlin語言完成的,基於socket的簡易聊天程序

一 kotlin的socket使用:

創建socket:

被動監聽:變量host是端口號,client是一個Socket

val server = ServerSocket(host)
val client = server.accept()

主動發送:變量mHost是IP地址,mPort是端口號

val socket = Socket(mHost, mPort)

kotlin和java通過流來操縱socket發送和接收數據

獲得輸出流,將數據寫入流並發送:(sc.nextLine().encodeToByteArray()是獲取輸入行並轉換為字節)

getOutputStream().write(sc.nextLine().encodeToByteArray())

獲得輸入流,將數據寫入Byte數組:(bts是Byte數組)

getInputStream().read(bts)

二 程序工作方式和代碼:

main.kt:

開始以后輸入0進入接收者模式 

在接收者模式下可以接收消息並回復消息

輸入1進入發送者模式

在發送者模式下可以發送消息到指定IP地址

輸入1后會要求輸入目標IP地址

import java.util.*

val sc = Scanner(System.`in`)
fun main() {
println(
"請選擇模式:\n" +
"0 接收者模式(可以接收並回復消息)\n" +
"1 發送者模式(可以發送消息並接收回復"
)
when (sc.nextInt()) {
0 -> {
sc.nextLine()
println("已進入接收者模式")
Listener(4096)
}
1 -> {
println("請輸入目標IP")
sc.nextLine()
Speaker(sc.nextLine())
}
}
}

發送者模式 Speaker.kt

反復創建一個到目標的socket,寫入鍵盤輸入,讀取回復並打印 循環工作

once(string)是發送string並打印回復一次的方法

init過程會反復調用once以多次發送消息

import java.net.Socket

class Speaker(host: String = "127.0.0.1", port: Int = 4096) {
private val mHost = host
private val mPort = port
private val mBytes = ByteArray(1024)
private fun once(string: String = "你好") {
try {
Socket(mHost, mPort).apply {
getOutputStream().write(string.encodeToByteArray())
getInputStream().read(mBytes)
println(String(mBytes))
close()
}
} catch (e: Exception) {
println(e)
throw e
}
}

init {
println("已進入發送者模式")
try {
while (true) {
once(sc.nextLine())
}
} catch (e: Exception) {
}
}
}

接收者模式 Listener.kt

反復創建監聽的socket,讀取輸入流並打印,然后將鍵盤輸入寫入輸出流並發送

once(string)是發送string並打印回復一次的方法

init過程會反復調用once以多次發送消息

import java.net.ServerSocket

class Listener(host: Int) {
private val server = ServerSocket(host)
private val bts = ByteArray(20480)

init {
Thread {
while (true) {
server.accept().apply {
getInputStream().read(bts)
println(String(bts))
getOutputStream().write(sc.nextLine().encodeToByteArray())
}
}
}.start()
}
}

程序效果展示:
(綠色是鍵盤輸入)
發送者:

j

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM