问题描述
我已经阅读了许多不同的帖子和问题,在我看来,这应该相对容易解决。我设法使用一个套接字对象将 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(),6670
)
sRec.send(udpPacket)
data = "Packet2"
udpPacket = DatagramPacket(
data.toByteArray(),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,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
发送的消息,即使它们都绑定到相同的(地址、端口)。有人可以帮我理解我所缺少的。非常感谢您的时间和帮助。
解决方法
服务器和客户端应该在两个不同的线程上,以确保一个不会阻塞另一个。