Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中使用套接字发送和接收字符串_Android_Kotlin - Fatal编程技术网

android中使用套接字发送和接收字符串

android中使用套接字发送和接收字符串,android,kotlin,Android,Kotlin,我有一个简单的客户端和服务器套接字应用程序,基于此相互连接。问题是,我可以发送和获取值,但当客户端从服务器获得答案时,会继续发送消息 我的问题在哪里 这是服务器:我的服务器套接字正在服务中。我在服务启动时执行它 class SocketService: Service() { override fun onBind(intent: Intent?): IBinder? { return null } override fun onStartCommand(intent: Intent

我有一个简单的客户端和服务器套接字应用程序,基于此相互连接。问题是,我可以发送和获取值,但当客户端从服务器获得答案时,会继续发送消息

我的问题在哪里

这是服务器:我的服务器套接字正在服务中。我在服务启动时执行它

class SocketService: Service() {

override fun onBind(intent: Intent?): IBinder? {
    return null
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    thread { ClientHandler().run() }
    return START_STICKY
}

internal inner class ClientHandler() : Runnable{
    override fun run() {
        val server = ServerSocket(5000)
        val client = server.accept()
        var reader = BufferedReader(InputStreamReader(client.getInputStream()))
        var writer = PrintWriter(client.getOutputStream())
        try {
            receiveString = reader.readLine()
            while(receiveString != "")
            {
                println(receiveString)
                writer.write("hello from server" + "\n")
                writer.flush()
            }

            writer.close();
            reader.close();
            server.close();
            client.close();

        } catch (ex: Exception) {
            Timber.e("$TAG $formatted $ex")
        }
    }

}
我的客户:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    connectToPaymentService()
}

fun connectToPaymentService(){
    thread { ThreadopenPort().run() }
}


internal inner class ThreadopenPort : Runnable {
    override fun run() {
        val socket: Socket
        try {
            socket = Socket(SERVER_IP, SERVER_PORT)
            output = PrintWriter(socket.getOutputStream())
            input = BufferedReader(InputStreamReader(socket.getInputStream()))

            rMessage = input!!.readLine()
            println(rMessage)
            while(rMessage != ""){
                output!!.write("hello from client" + "\n")
                output!!.flush()
                rMessage = input!!.readLine()
            }

            output!!.close();
            input!!.close();
            socket.close();


        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}
@索利亚萨-

  • 如果我给你举个例子,它将是Java语言,而不是Kotlin;)
  • 在风格上,您应该更喜欢显式的“close()”。这不会帮助你解决眼前的问题,但这是一个好习惯:)
  • 您的问题是:
    while(receiveString!=“”)
    。你循环。。。但是“receiveString”永远不会被修改。所以循环永远不会终止。哎呀 建议的备选方案:

    我相信这个习惯用法可以成功地应用于套接字“read”循环


    请将您发现的内容发回:)

    建议:尝试“使用”功能块:@paulsm4我检查过了,但看起来没有用。您能举个例子吗?您的服务器只读取行。它从不发短信。但是你的客户在试着读台词。您的客户端将挂起。readLine(),因为没有收到任何消息。@blackapps逻辑是首先客户端发送“来自客户端的你好”,然后服务器将发送“来自服务器的你好”,然后我知道它们彼此连接,但问题是在收到此消息后,我将继续收到消息“来自客户端的你好”不,您的逻辑不同。客户端不会首先向服务器发送一行。客户端首先尝试读取一行。但是服务器从不发送一条线路。因此,客户端“挂起”在.readLine()中。你不知道你的逻辑/协议。谢谢你的帮助,我找到了另一种解决方案,但现在我有另一个问题,你能检查一下吗?
    BufferedReader(reader).use { r ->
        r.lineSequence().forEach {
            println(it)
        }
    }