如何使用 kotlin 通过 TCP 连接发送和接收字符串

Tam*_*Ali 9 sockets android tcp kotlin

我在 Windows 上有一个 TCP 服务器,我想在服务器和我的 Android 设备之间发送和接收文本字符串。

我花了很多时间寻找使用 Kotlin 的示例,但没有找到任何有用的代码,所以我现在只能创建套接字和连接。

fun connect() {
    try{
        val soc = Socket("192.168.1.5", 1419)
        val dout = DataOutputStream(soc.getOutputStream())
        dout.writeUTF("1")

        dout.flush()
        dout.close()
        soc.close()
    }
    catch (e:Exception){
        e.printStackTrace()
    }
}
Run Code Online (Sandbox Code Playgroud)

Max*_*rcu 13

你可以检查这个简单的例子。希望能帮到你!

服务器:

fun main() {
    val server = ServerSocket(9999)
    println("Server running on port ${server.localPort}")
    val client = server.accept()
    println("Client connected : ${client.inetAddress.hostAddress}")
    val scanner = Scanner(client.inputStream)
    while (scanner.hasNextLine()) {
        println(scanner.nextLine())
        break
    }
    server.close()
}
Run Code Online (Sandbox Code Playgroud)

客户:

fun main() {
    val client = Socket("127.0.0.1", 9999)
    client.outputStream.write("Hello from the client!".toByteArray())
    client.close()
}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,也许我没有正确回答您的问题。您的问题是“如何使用 Kotlin 通过 TCP 连接发送和接收字符串”在我发送给您的代码片段中,客户端正在向接收它并打印到控制台的服务器发送一个字符串(“来自客户端的Hello”)。您能否详细说明一下您的问题,例如我可以更新我的代码片段? (2认同)

Syl*_*are 5

您也可以使用ktor来完成此操作,它是一个基于 kotlin 的异步框架。它本身使用允许并发的协程。

使用 Kotlin 1.4 和 ktor 1.6.0,将其添加到您的build.gradle.kts

plugins {
    kotlin("jvm") version "1.4.32"
}

dependencies {
    implementation("io.ktor:ktor-server-netty:1.6.0")
    implementation("io.ktor:ktor-network:1.6.0")
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用套接字,它仍然有点实验性,但它已经实现了,ktor-network现在需要更新的版本。

这是代码:

服务器:

suspend fun server() {
    val server = aSocket(ActorSelectorManager(Executors.newCachedThreadPool().asCoroutineDispatcher())).tcp()
        .bind(InetSocketAddress("127.0.0.1", 2323))
    println("Server running: ${server.localAddress}")
    val socket = server.accept()
    println("Socket accepted: ${socket.remoteAddress}")
    val input = socket.openReadChannel()
    val output = socket.openWriteChannel(autoFlush = true)
    val line = input.readUTF8Line()

    println("received '$line' from ${socket.remoteAddress}")
    output.writeFully("$line back\r\n".toByteArray())
}
Run Code Online (Sandbox Code Playgroud)

客户:

suspend fun client() {
    val socket = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp()
        .connect(InetSocketAddress("127.0.0.1", 2323))
    val input = socket.openReadChannel()
    val output = socket.openWriteChannel(autoFlush = true)

    output.writeFully("hello\r\n".toByteArray())
    println("Server said: '${input.readUTF8Line()}'")
}
Run Code Online (Sandbox Code Playgroud)

运行它们:

fun main() {
    CoroutineScope(Dispatchers.Default).launch { server() }
    runBlocking { client() }
}
Run Code Online (Sandbox Code Playgroud)

当您运行它们时,客户端将发送一条消息,服务器将响应,您应该看到如下内容:

Server running: /127.0.0.1:2323
Socket accepted: /127.0.0.1:56215
received 'hello' from /127.0.0.1:56215
Server said: 'hello back'
Run Code Online (Sandbox Code Playgroud)

在他们的文档中找到更多示例简单的回显服务器