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

时间:2019-06-11 01:58:16

标签: android sockets kotlin tcp

我在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()
    }
}

3 个答案:

答案 0 :(得分:2)

您也可以使用 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")
}

然后你可以使用 sockets,它仍然有点实验性,但它已经到了那里,现在需要更新的版本 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())
}

客户:

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()}'")
}

同时运行它们:

fun main() {
    CoroutineScope(Dispatchers.Default).launch { server() }
    runBlocking { client() }
}

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

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'

在他们的文档中查找更多示例 simple echo server

答案 1 :(得分:0)

您可以检查这个简单的示例。希望对您有帮助!

服务器:

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()
}

客户

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

答案 2 :(得分:0)

根据我的实验,有2件重要的事情:

  1. 在AndroidManifest.xml中获取权限

  2. 从后台线程创建套接字,以下对我有用:

    Executors.newSingleThreadExecutor().execute {
        val socket = Socket("192.168.0.15", 50000)
        val scanner = Scanner(socket.getInputStream())
        val printWriter = PrintWriter(socket.getOutputStream())
        while (scanner.hasNextLine()) {
            Log.d(TAG, "${ scanner.nextLine() }")
        }
    }

这是source code in GitHub。 有一个my experiment的视频。