簡體   English   中英

從 Android 客戶端連續發送數據到 Python 服務器套接字

[英]Continuously Send Data from Android Client to Python Server Socket

我目前正在嘗試使用 sockets 將應用程序中的 ble 數據發送到我的 PC。 截至目前,我可以向服務器發送數據,但服務器只接收到一個數據,然后停止接收。 我懷疑我的客戶端代碼有問題。 任何幫助,將不勝感激

我的 SocketClass 代碼:

inner class SocketClass{
    fun doInBackground(message: String): String {
        try {
            socket = Socket(SERVER_IP, SERVERPORT)
            val outputStream = OutputStreamWriter(socket?.getOutputStream())
            val printwriter = BufferedWriter(outputStream)
            printwriter.write(message)
            printwriter.flush()
            printwriter.close()
            socket?.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }catch (e: UnknownHostException){

        }
        return ""
    }
}

在 blereadcharacteristic 中,我在這樣的線程中調用 class:

private fun readDeviceCharacteristic(characteristic: BluetoothGattCharacteristic) {
        var hashval:MutableMap<String, String> = mutableMapOf()
        var mainThreadList :MutableList<String> = mutableListOf()
        var currentTime: String = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").withZone(
            ZoneId.of("Asia/Seoul")).format(Instant.now())  // Get current Timestamp
        if(idlist.size != 0) {
            readval = characteristic.getStringValue(0)
            valdata = readval.subSequence(3, readval.length).toString()
            idNo = readval.subSequence(0, 2).toString()
            parseList.add(readval)
            mainThreadList = parseList.toMutableList().distinctBy{it.subSequence(0, 2)} as MutableList<String>
            if(mainThreadList.size == maxConnLimit) {
                bleDataList = mainThreadList
                bleDataList.forEach{
                    hashval[it.subSequence(0, 2).toString()] = it.subSequence(3, it.length).toString()
                }
                loghash = hashval.toSortedMap()
                txtRead = bleDataList.toString()
                parseList.clear()
                if(isChecked) {
                    savehash["Time"]?.add("$sec.$millis")
                    bleDataList.forEach {
                        savehash[it.subSequence(0, 2).toString()]?.add(
                            it.subSequence(
                                3,
                                it.length
                            ).toString()
                        )
                    }

                }else{
                    time = 0
                    sec = 0
                    millis = ""
                }
                if(isInsert){
                    Thread{
                        SocketClass().doInBackground("$loghash\r\n\r\n")
                    }.start()
                }

            }
        }
        isTxtRead = true
        bleDataList.clear()
    }

我的服務器套接字 python 代碼:

    import socket
import sys

host = '19.201.12.12'
port = 30001
address = (host, port)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(address)
server_socket.listen(5)

print("Listening for client . . .")
conn, address = server_socket.accept()
print("Connected to client at ", address)                                                  
while True:
    output = conn.recv(2048);
    if output.strip() == "disconnect":
        conn.close()
        sys.exit("Received disconnect message.  Shutting down.")

    elif output:
        print("Message received from client:")
        print(output)

我能夠發送第一個數據,但之后什么也沒有收到。 任何幫助將不勝感激謝謝!

您的服務器代碼只接受一個客戶端連接。 所以,這是時間安排。

  1. Python 等待accept
  2. Kotlin 連接
  3. Python 進入while True循環。
  4. Kotlin 寫入,然后關閉套接字。

到那時,Python 代碼將不會收到任何進一步的信息,但是因為您不再調用accept ,所以您不能接受另一個連接。

您需要循環accept 您處理該連接直到它關閉,然后您循環到另一個accept

您可能會考慮使用socketserver模塊,它可以自動執行其中的一些操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM