简易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

猜你喜欢

转载自www.cnblogs.com/Miliapus/p/12024809.html