安卓监听端口接收消息

文章目录

  • 其他文章
  • 建立新线程
  • 完整代码

其他文章

下面是我的另一篇文章,是在电脑上发送数据,配合本篇文章,可以实现电脑与手机的局域网通讯。直接复制粘贴就能行,非常滴好用。
点击连接
另外,如果你不知道你的手机ip,也可以通过如下文章获取哦。
点击连接

建立新线程

在执行网络数据的接收操作时,需要使用Thread来创建一个新的线程。首先,创建一个Thread对象,并传入一个Runnable对象作为参数。Runnable对象定义了线程要执行的操作。

val receiveThread = Thread(Runnable {
    val udpSocket = DatagramSocket(port)
    val buffer = ByteArray(1024)
    val packet = DatagramPacket(buffer, buffer.size)

    while (!Thread.currentThread().isInterrupted) {
        try {
            udpSocket.receive(packet)
            val receivedData: String = String(packet.data, 0, packet.length)
            runOnUiThread {
                updateReceivedMessage(receivedData)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    udpSocket.disconnect()
    udpSocket.close()
})

在Runnable对象的run方法中,我们创建了一个DatagramSocket对象,并指定了要监听的端口号。然后我们创建了一个字节数组buffer以及一个DatagramPacket对象packet,用于接收UDP数据。

在一个循环中,我们使用udpSocket.receive(packet)方法来接收数据。一旦有数据到达,receive方法会阻塞,直到数据到达或者发生异常。当数据到达后,使用packet对象从接收到的数据中提取字符串,并调用runOnUiThread方法来在UI线程中更新界面上的receivedMessageTextView的文本内容,显示接收到的消息。

在循环结束后,记得关闭udpSocket连接。

完整代码

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.widget.TextView
import java.net.DatagramPacket
import java.net.DatagramSocket

class MainActivity : AppCompatActivity() {
    private val port = 8888

    private lateinit var receivedMessageTextView: TextView

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

        receivedMessageTextView = findViewById(R.id.tv_received_message)

        val receiveThread = Thread(Runnable {
            val udpSocket = DatagramSocket(port)
            val buffer = ByteArray(1024)
            val packet = DatagramPacket(buffer, buffer.size)

            while (!Thread.currentThread().isInterrupted) {
                try {
                    udpSocket.receive(packet)
                    val receivedData: String = String(packet.data, 0, packet.length)
                    runOnUiThread {
                        updateReceivedMessage(receivedData)
                    }
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
            udpSocket.disconnect()
            udpSocket.close()
        })

        receiveThread.start()
    }

    private fun updateReceivedMessage(message: String) {
        receivedMessageTextView.text = message
    }
}

你可能感兴趣的:(Android,android)