Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send and receive strings through TCP connection using kotlin

I have a TCP Server on Windows, and I want to send and receive text strings between the server and my Android device.

I spent alot of time searching for an example using Kotlin but I didn't find any useful code, so I'm now only able to create the socket and connect.

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()
    }
}
like image 944
Tamer Ali Avatar asked Jun 11 '19 01:06

Tamer Ali


2 Answers

You can also do it with ktor, it's a kotlin based asynchronous framework. It uses coroutines natively which allow concurrency.

Use Kotlin 1.4 and ktor 1.6.0, add it to your 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")
}

Then you can use the sockets, it's still a bit experimental but it's getting there, with newer version ktor-network is now necessary.

Here is the code:

Server:

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

Client:

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 them both:

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

When you run them, the client will send a message, the server will respond and you should see something like this:

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'

Find more example on their documentation simple echo server

like image 145
Sylhare Avatar answered Oct 31 '22 20:10

Sylhare


You can check this simple example. Hope it'll help you!

Server:

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

Client:

fun main() {
    val client = Socket("127.0.0.1", 9999)
    client.outputStream.write("Hello from the client!".toByteArray())
    client.close()
}
like image 32
Maxim Bîrcu Avatar answered Oct 31 '22 19:10

Maxim Bîrcu