其他文章
下面是我的另一篇文章,是在電腦上發(fā)送數(shù)據(jù),配合本篇文章,可以實(shí)現(xiàn)電腦與手機(jī)的局域網(wǎng)通訊。直接復(fù)制粘貼就能行,非常滴好用。
點(diǎn)擊連接
另外,如果你不知道你的手機(jī)ip,也可以通過如下文章獲取哦,這文章的是局域網(wǎng)IP,限于局域網(wǎng)測(cè)試。
點(diǎn)擊連接
監(jiān)聽端口
我們可以創(chuàng)建一個(gè)DatagramSocket對(duì)象,用于在指定的端口上接收UDP消息。
DatagramSocket是Java中用于進(jìn)行UDP通信的類,它代表一個(gè)數(shù)據(jù)報(bào)套接字。通過DatagramSocket對(duì)象,我們可以發(fā)送和接收UDP數(shù)據(jù)報(bào)。
示例代碼如下:
val udpSocket = DatagramSocket(port)
port變量是指定的端口號(hào),用于指定UDP套接字綁定的端口。創(chuàng)建的udpSocket對(duì)象將在目標(biāo)端口號(hào)上進(jìn)行監(jiān)聽,用于接收來自其他節(jié)點(diǎn)的UDP消息。
接收消息
一旦創(chuàng)建了DatagramSocket對(duì)象,就可以使用該對(duì)象的receive方法來接收UDP消息,并將接收到的數(shù)據(jù)存儲(chǔ)在一個(gè)DatagramPacket對(duì)象中,然后通過解析DatagramPacket對(duì)象來獲取實(shí)際的消息內(nèi)容。
示例代碼如下:
val buffer = ByteArray(1024)
val packet = DatagramPacket(buffer, buffer.size)
udpSocket.receive(packet)
接收到消息后,就可以進(jìn)行相應(yīng)的處理操作,比如更新UI等。
建立新線程
在Android開發(fā)中,主線程(也稱為UI線程)負(fù)責(zé)處理用戶界面的更新和響應(yīng)用戶交互事件,包括處理用戶輸入、渲染界面等操作。如果在主線程中執(zhí)行耗時(shí)的操作,如網(wǎng)絡(luò)請(qǐng)求、文件讀寫等,會(huì)導(dǎo)致界面卡頓、無響應(yīng)或ANR錯(cuò)誤。
為避免這種情況,在執(zhí)行網(wǎng)絡(luò)數(shù)據(jù)的接收操作時(shí),需要使用Thread來創(chuàng)建一個(gè)新的線程。將耗時(shí)的操作放在新的線程中執(zhí)行,保持主線程的響應(yīng)性。這樣,主線程仍然可以繼續(xù)處理用戶界面的更新和事件,而不會(huì)因?yàn)樽枞诮邮障⒉僮魃隙a(chǎn)生卡頓或無響應(yīng)的情況。
開啟新線程,首先創(chuàng)建一個(gè)Thread對(duì)象,并傳入一個(gè)Runnable對(duì)象作為參數(shù)。Runnable對(duì)象定義了線程要執(zhí)行的操作。
示例代碼如下:
val receiveThread = Thread(Runnable {
})
在線程中,我們可以通過Thread.currentThread()方法獲得當(dāng)前執(zhí)行的線程對(duì)象。
而通過線程對(duì)象的isInterrupted()方法可以檢查當(dāng)前線程是否被中斷。如果線程被中斷,isInterrupted()方法會(huì)返回true,否則返回false。
如此一來,我們可以在線程中通過一個(gè)循環(huán),來不斷的接收數(shù)據(jù)。
示例代碼如下:
while (!Thread.currentThread().isInterrupted) {
}
循環(huán)條件表示當(dāng)當(dāng)前線程不被中斷時(shí)執(zhí)行循環(huán)體內(nèi)的代碼。這樣程序就在后臺(tái)線程中執(zhí)行持續(xù)性的任務(wù),直到線程被中斷或任務(wù)完成才退出循環(huán)。
當(dāng)然了,要在循環(huán)體內(nèi)部結(jié)束循環(huán)的話,只要執(zhí)行Thread.currentThread().interrupt()方法即可,該方法會(huì)中斷當(dāng)前線程。然后isInterrupted()方法將會(huì)返回true,循環(huán)條件將不再滿足,從而退出循環(huán)。這可以用來停止線程的執(zhí)行并終止循環(huán)。
最后我們得到如下代碼:
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對(duì)象的run方法中,我們創(chuàng)建了一個(gè)DatagramSocket對(duì)象,并指定了要監(jiān)聽的端口號(hào)。然后我們創(chuàng)建了一個(gè)字節(jié)數(shù)組buffer以及一個(gè)DatagramPacket對(duì)象packet,用于接收UDP數(shù)據(jù)。
在循環(huán)中,我們使用udpSocket.receive(packet)方法來接收數(shù)據(jù)。一旦有數(shù)據(jù)到達(dá),receive方法會(huì)阻塞,直到數(shù)據(jù)到達(dá)或者發(fā)生異常。當(dāng)數(shù)據(jù)到達(dá)后,使用packet對(duì)象從接收到的數(shù)據(jù)中提取字符串,并調(diào)用runOnUiThread方法來在UI線程中更新界面上的receivedMessageTextView的文本內(nèi)容,顯示接收到的消息。文章來源:http://www.zghlxwxcb.cn/news/detail-660664.html
在循環(huán)結(jié)束后,記得關(guān)閉udpSocket連接。文章來源地址http://www.zghlxwxcb.cn/news/detail-660664.html
完整代碼
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
}
}
到了這里,關(guān)于安卓監(jiān)聽端口接收消息的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!