Connect android device to python project via socket

断了今生、忘了曾经 提交于 2020-08-10 19:44:49

问题


BufferedReader.readline not works, I am trying to connect Android devices to the Server, Server side programming language is Python.

server.py

LENGTH = 1024
PORT = 1234
time.sleep(1)
s = socket.socket()
host = socket.gethostname()
ip = socket.gethostbyname(host)
s.bind((host, PORT))
# name = input(str("Enter your name: "))
name = "Admin"

s.listen(1)
print("\nWaiting for incoming connections...\n")
conn, addr = s.accept()
print("Received connection from ", addr[0], "(", addr[1], ")\n")

s_name = conn.recv(LENGTH)
s_name = s_name.decode()
print(s_name, "has connected to the chat room\nEnter [e] to exit chat room\n")
conn.send(name.encode())

def send():
    print("Start messaging ...\n")
    while 1:
        message = input()
        if message == "[e]":
            message = "Left chat room!"
            conn.send(message.encode())
            print("\n")
            break
        conn.send(message.encode())


def receive():
    while 1:
        message = conn.recv(LENGTH)
        message = message.decode()
        print(s_name, ":", message)


thread_receive = threading.Thread(target=receive)
thread_receive.start()

thread_send = threading.Thread(target=send)
thread_send.start()

and it works with Python code as a client, but not works with Android Kotlin:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    editTextMessage = findViewById(R.id.editTextMessage)
    connect()
    buttonSubmit.setOnClickListener {
        Log.w(TAG, "Button Submit Clicked ...")
        send()
    }
}

private lateinit var editTextMessage: EditText
private val IP = "192.168.100.08"
private val PORT = 5050 // 1234
private lateinit var printWriter: PrintWriter

private fun send() {
    val threadSend = Thread {
        try {
            val sendMessage = editTextMessage.text.toString()
            printWriter.print(sendMessage.length)
            printWriter.flush()
            printWriter.print(sendMessage)
            printWriter.flush()
            clearMessagebox()
        } catch (eIO: IOException) {
            Log.e(TAG, "IOException, ${eIO.message}", eIO)
        } catch (e: Exception) {
            Log.e(TAG, "IOException, ${e.message}", e)
        }

    }
    threadSend.start()
}

private fun receive(socket: Socket) {
    val threadSend = Thread {
        try {
            val inputStream = InputStreamReader(
                socket.getInputStream()
            )
            val bufferedReader = BufferedReader(
                inputStream
            )
            var receiveMessage: String? = null
            while (true) {
                val sendMessage = bufferedReader.readLine()
                if (bufferedReader.readLine()
                        .also({ receiveMessage = it }) != null
                ) //receive from server
                {
                    Log.w(TAG, "Receive Message: ${receiveMessage.toString()}")
                    Log.w(TAG, "Send Message: $sendMessage")
                }
            }
        } catch (eIO: IOException) {
            Log.e(TAG, "IOException, ${eIO.message}", eIO)
        } catch (e: Exception) {
            Log.e(TAG, "IOException, ${e.message}", e)
        }

    }
    threadSend.start()
}

private fun clearMessagebox() {
    if (Looper.getMainLooper().thread == Thread.currentThread()) {
        editTextMessage.text.clear()
    } else {
        runOnUiThread { editTextMessage.text.clear() }
    }
}

private fun connect() {
    val threadConnect = Thread {
        try {
            Log.w(TAG, "Connecting ...")
            val socket = Socket(IP, PORT)
            socket.receiveBufferSize = 1024
            printWriter = PrintWriter(socket.getOutputStream())
            printWriter.print("HosseinKurd".length)
            printWriter.flush()
            printWriter.print("HosseinKurd")
            printWriter.flush()
            Log.w(TAG, "Connected.")
            receive(socket)
        } catch (eIO: IOException) {
            Log.e(TAG, "IOException, ${eIO.message}", eIO)
        } catch (e: Exception) {
            Log.e(TAG, "IOException, ${e.message}", e)
        }
    }
    threadConnect.start()
}

来源:https://stackoverflow.com/questions/63127834/connect-android-device-to-python-project-via-socket

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!