我在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()
}
}
答案 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件重要的事情:
在AndroidManifest.xml中获取权限
从后台线程创建套接字,以下对我有用:
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的视频。