首页 > 解决方案 > android Kotlin socketscanner.hasNext() 没有响应

问题描述

服务器端语言:Python

客户端语言:Kotlin、Android

它在一行中接收来自不同行的数据。

class SampleActivity : AppCompatActivity() {

    private val TAG = "SAMPLE_ACTIVITY_TAG"
    private lateinit var editTextMessage: EditText
    private val IPs = listOf("192.168.100.30")
    private val PORTs = listOf(5050)
    private val INDEX_SERVER = 0
    private var socket: Socket? = null
    private val IP = IPs[INDEX_SERVER]
    private val PORT = PORTs[INDEX_SERVER]
    private lateinit var outPrintWriter: PrintWriter
    private val CONNECTION_TOKEN = "fab2bd65f67193d761c06b07a708d3232f0d8569"
    private val TAG_CONNECT_START = "[CONNECT]"
    private val TAG_CONNECT_END = "[/CONNECT]"
    private val TAG_TRANSFER_START = "[TRANSFER]"
    private val TAG_TRANSFER_END = "[/TRANSFER]"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        editTextMessage = findViewById(R.id.editTextMessage)
        CoroutineScope(Dispatchers.IO).launch {
            connect()
        }
        buttonSubmit.setOnClickListener {
            if(editTextMessage.text.toString().trim().isEmpty()){
                return@setOnClickListener
            }
            CoroutineScope(Dispatchers.IO).launch {
                send(messageConverter(TAG_TRANSFER_START + editTextMessage.text.toString().trim() + TAG_TRANSFER_END))
            }
        }
    }

    override fun onDestroy() {
        outPrintWriter.close()
        super.onDestroy()
    }

    private fun messageConverter(text: String): String {
        Log.w(TAG, "[CONVERTING] \nMessage: $text\nAscii: ${text.toASCII()}")
        return text.toASCII() // Defined in extention.kt
    }

    private suspend fun connect() {
        try {
            Log.w(TAG, "[CONNECTING] Connecting to: $IP:$PORT")
            socket = Socket(IP, PORT)
            socket?.receiveBufferSize = 1024
            socket?.soTimeout = 1 * 60 * 60
            outPrintWriter = PrintWriter(socket!!.getOutputStream())
            send(messageConverter(TAG_CONNECT_START + CONNECTION_TOKEN + TAG_CONNECT_END))
            receive()
        } catch (uHE: UnknownHostException) {
            Log.e(TAG, "[ERROR] UnknownHostException, ${uHE.message}", uHE)
        } catch (eIO: IOException) {
            Log.e(TAG, "[ERROR] IOException, ${eIO.message}", eIO)
        } catch (e: Exception) {
            Log.e(TAG, "[ERROR] Exception, ${e.message}", e)
        }
    }

    private suspend fun send(text: String) {
        try {
            Log.w(TAG, "[SENDING] Message: $text")
            outPrintWriter.print(text)
            outPrintWriter.flush()
            Log.w(TAG, "[SENDING] finished .")
            clearMessageBox()
        } catch (eIO: IOException) {
            Log.e(TAG, "[ERROR] IOException, ${eIO.message}", eIO)
        } catch (e: Exception) {
            Log.e(TAG, "[ERROR] IOException, ${e.message}", e)
        }
    }

    private suspend fun receive() {
        try {
                            val scanner = Scanner(
                socket?.getInputStream()
            )
            val lines = ArrayList<String>()
            var line: String?
            while (scanner.hasNextLine()) {
                Logger.w(TAG, "[RECEIVING] Scanner hasNext")
                line = scanner.nextLine()
                if (!line.isNullOrEmpty()) {
                    lines.add(line)
                }
            }
            Logger.w(TAG, "[RECEIVING] Exit While loop : ${lines}")
        } catch (eIO: IOException) {
            Log.e(TAG, "[ERROR] Receive IOException error: ${eIO.message}", eIO)
        } catch (e: Exception) {
            Log.e(TAG, "[ERROR] Receive Exception error: ${e.message}", e)
        }
    }

    private suspend fun clearMessageBox() {
        withContext(Main) {
            editTextMessage.text.clear()
        }
    }
}

日志:

[CONNECTING] Connecting to: 192.168.100.30:5050
[CONVERTING] 
Message: [CONNECT]fab2bd65f67193d761c06b07a708d3232f0d8569[/CONNECT]
Ascii: 91,67,79,78,78,69,67,84,93,102,97,98,50,98,51,50,102,48,100,49,55,56,99,48,54,55,48,56,53,55,97,100,54,53,102,54,54,98,48,100,51,50,57,49,57,51,100,55,54,91,47,67,79,78,78,69,67,84,93
[SENDING] Message: 91,67,79,78,78,69,67,84,93,102,97,98,50,98,51,50,102,48,100,49,55,56,99,48,54,55,48,56,53,55,97,100,54,53,102,54,54,98,48,100,51,50,57,49,57,51,100,55,54,91,47,67,79,78,78,69,67,84,93
[SENDING] finished.
[RECEIVING] Scanner hasNext
[RECEIVING] Exit While loop : [OK1OK2]

Log: **[RECEIVING] Exit While loop :** shall be `[OK1, OK2]`

服务器每秒发送两次消息

我刚刚检查了一些问题和示例 b,不幸的是,就我而言,没有人解决上述问题

标签: androidsocketskotlinjava.util.scannerreadline

解决方案


推荐阅读