【发布时间】:2019-11-14 09:43:07
【问题描述】:
我正在寻找一种在每次收到 UDP 数据包时触发名为 receiveUDP 的函数的方法。我怎样才能在 Kotlin 上做到这一点?这是我目前正在像简单聊天一样工作的代码。
它使用 01 editText 用于用户输入,01 textView 用于显示接收到的数据包和一个按钮来发送用户输入。
package com.e.udpchat1
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.StrictMode
import android.view.View
import android.widget.EditText
import android.widget.TextView
import java.io.IOException
import java.net.DatagramPacket
import java.net.DatagramSocket
import java.net.InetAddress
class SoftOptions {
var RemoteHost: String = "192.168.1.255"
var RemotePort: Int = 6454
constructor()
init{}
}
// Global
val Settings = SoftOptions()
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Where should I call?
// var Buffer = receiveUDP(1500)
// so that it constantly listen to incoming UDP packets
}
fun clickButtonSend(view: View) {
// Do something in response to button
// Send editText1 Text thru UDP.
val editText = findViewById<EditText>(R.id.editText1)
var message = editText.text.toString()
sendUDP(message)
// Add text to textView1.
val textView = findViewById<TextView>(R.id.textView1)
var chat = textView.text.toString()
textView.setText(chat + message + "\n")
// Clear editText1 after all sent.
editText.setText("")// Clear Input text.
}
fun sendUDP(messageStr: String) {
// Hack Prevent crash (sending should be done using an async task)
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
try {
//Open a port to send the package
val socket = DatagramSocket()
socket.broadcast = true
val sendData = messageStr.toByteArray()
val sendPacket = DatagramPacket(sendData, sendData.size, InetAddress.getByName(Settings.RemoteHost), Settings.RemotePort)
socket.send(sendPacket)
println("fun sendBroadcast: packet sent to: " + InetAddress.getByName(Settings.RemoteHost) + ":" + Settings.RemotePort)
} catch (e: IOException) {
// Log.e(FragmentActivity.TAG, "IOException: " + e.message)
}
}
fun receiveUDP( size: Int): ByteArray {
val ret = ByteArray(size)
var socket: DatagramSocket? = null
try {
//Keep a socket open to listen to all the UDP trafic that is destined for this port
socket = DatagramSocket(Settings.RemotePort, InetAddress.getByName(Settings.RemoteHost))
socket.broadcast = true
val Buffer = ByteArray(1500)
val packet = DatagramPacket(Buffer, Buffer.size)
socket.receive(packet)
// Add text to textView1.
val textView = findViewById<TextView>(R.id.textView1)
val chat = textView.text.toString()
textView.setText(chat + packet + "\n")
} catch (e: Exception) {
e.printStackTrace()
} finally {
socket?.close()
}
return ret
}
}
我希望在 textView1 中看到每个收到的数据包。
【问题讨论】:
标签: android kotlin udp udpclient