如何在 Android 应用程序中通过 UDP 套接字接收数据
How to receive data through UPD socket in Android Application
我已经阅读了许多不同的帖子和问题,在我看来,这应该相对容易做对。我设法使用一个套接字对象将 UDP 数据包发送到正确的(地址,端口),但只能使用相同的套接字对象读取消息。在我的代码中可以在下面看到此行为以及相应的输出:
GlobalScope.launch {
val messageStr = "Hello Android!"
val s = DatagramSocket(null)
s.reuseAddress = true
s.broadcast = true
s.bind(InetSocketAddress(6670))
s.soTimeout = 1500
var local = InetAddress.getByName("0.0.0.0")
val msg_length = messageStr.length
val messageSent = messageStr.toByteArray()
val p = DatagramPacket(messageSent, msg_length, local, 6670)
s.send(p)
val sRec = DatagramSocket(null)
sRec.reuseAddress = true
sRec.broadcast = true
sRec.bind(InetSocketAddress(6670))
Log.d("testUDP", "SoTimeOut:${sRec.soTimeout}")
sRec.soTimeout = 1500
var data = "Packet0"
var udpPacket = DatagramPacket(
data.toByteArray(),
data.length,
InetAddress.getByName("0.0.0.0"),
6670
)
sRec.send(udpPacket)
data = "Packet1"
udpPacket = DatagramPacket(
data.toByteArray(),
data.length,
InetAddress.getByName("0.0.0.0"),
6670
)
sRec.send(udpPacket)
data = "Packet2"
udpPacket = DatagramPacket(
data.toByteArray(),
data.length,
InetAddress.getByName("0.0.0.0"),
6670
)
sRec.send(udpPacket)
var text: String
val messageRec = ByteArray(1500)
val pRec = DatagramPacket(messageRec, messageRec.size)
var count = 0
while(count < 3){
try{
sRec.receive(pRec)
text = String(messageRec, 0, pRec.length)
Log.d("testUDP", "message:$text")
} catch (e: Exception){
e.printStackTrace()
}
count +=1
}
s.close()
sRec.close()
}
D/testUDP: message:Packet0
D/testUDP: message:Packet1
D/testUDP: message:Packet2
如您所见,套接字对象sRec
没有收到套接字对象s
发送的消息,即使它们都绑定到相同的(地址、端口)。有人可以帮助我了解我所缺少的东西。非常感谢您抽出宝贵时间提前提供帮助。
服务器和客户端应该在两个不同的线程上,以确保一个不会阻塞另一个。
我已经阅读了许多不同的帖子和问题,在我看来,这应该相对容易做对。我设法使用一个套接字对象将 UDP 数据包发送到正确的(地址,端口),但只能使用相同的套接字对象读取消息。在我的代码中可以在下面看到此行为以及相应的输出:
GlobalScope.launch {
val messageStr = "Hello Android!"
val s = DatagramSocket(null)
s.reuseAddress = true
s.broadcast = true
s.bind(InetSocketAddress(6670))
s.soTimeout = 1500
var local = InetAddress.getByName("0.0.0.0")
val msg_length = messageStr.length
val messageSent = messageStr.toByteArray()
val p = DatagramPacket(messageSent, msg_length, local, 6670)
s.send(p)
val sRec = DatagramSocket(null)
sRec.reuseAddress = true
sRec.broadcast = true
sRec.bind(InetSocketAddress(6670))
Log.d("testUDP", "SoTimeOut:${sRec.soTimeout}")
sRec.soTimeout = 1500
var data = "Packet0"
var udpPacket = DatagramPacket(
data.toByteArray(),
data.length,
InetAddress.getByName("0.0.0.0"),
6670
)
sRec.send(udpPacket)
data = "Packet1"
udpPacket = DatagramPacket(
data.toByteArray(),
data.length,
InetAddress.getByName("0.0.0.0"),
6670
)
sRec.send(udpPacket)
data = "Packet2"
udpPacket = DatagramPacket(
data.toByteArray(),
data.length,
InetAddress.getByName("0.0.0.0"),
6670
)
sRec.send(udpPacket)
var text: String
val messageRec = ByteArray(1500)
val pRec = DatagramPacket(messageRec, messageRec.size)
var count = 0
while(count < 3){
try{
sRec.receive(pRec)
text = String(messageRec, 0, pRec.length)
Log.d("testUDP", "message:$text")
} catch (e: Exception){
e.printStackTrace()
}
count +=1
}
s.close()
sRec.close()
}
D/testUDP: message:Packet0
D/testUDP: message:Packet1
D/testUDP: message:Packet2
如您所见,套接字对象sRec
没有收到套接字对象s
发送的消息,即使它们都绑定到相同的(地址、端口)。有人可以帮助我了解我所缺少的东西。非常感谢您抽出宝贵时间提前提供帮助。
服务器和客户端应该在两个不同的线程上,以确保一个不会阻塞另一个。