這是一個用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