Skip to content

Instantly share code, notes, and snippets.

@alinpopa
Created December 12, 2010 16:37
Show Gist options
  • Save alinpopa/738155 to your computer and use it in GitHub Desktop.
Save alinpopa/738155 to your computer and use it in GitHub Desktop.
Android Multicast Client - written in Scala
package org.test.android.multicast
import _root_.android.app.Activity
import _root_.android.os.Bundle
import _root_.android.widget.TextView
import _root_.android.app.Dialog
import _root_.android.util.Log
import _root_.android.net.wifi.WifiManager
import _root_.android.content.Context
class AndroidMulticastActivity extends Activity {
import java.net.{DatagramPacket, InetAddress, MulticastSocket, SocketTimeoutException}
import java.util.{Timer, TimerTask}
import java.lang.StringBuilder
class UdpClient(val address: String, val port: Int, val dataBuffer: StringBuilder) {
private val socket = new MulticastSocket(port)
private val group = InetAddress.getByName(address)
socket.joinGroup(group)
socket.setSoTimeout(250)
dataBuffer.append(group.isMulticastAddress().toString)
private val receiveTimer = new Timer("receiveTimer",true)
private val receiverTask = new ReceiverTask
receiveTimer.schedule(receiverTask, 2000)
private class ReceiverTask extends TimerTask {
private var finished = false
override def run = {finished = true}
def isFinished = finished
}
def execute: Unit = {
val msg = "QUERY"
val data = new DatagramPacket(msg.getBytes(), 0, msg.length(), group, port)
socket.send(data)
while(!receiverTask.isFinished){
receive
}
}
private def receive: Unit = {
val buffer = Array.ofDim[Byte](1024)
val receivedPacket = new DatagramPacket(buffer, buffer.length)
try{
socket.receive(receivedPacket)
val message = new String(receivedPacket.getData)
dataBuffer.append(message)
}catch{
case e:SocketTimeoutException => //
}
}
}
override def onCreate(savedInstanceState:Bundle):Unit = {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
val text = findViewById(R.id.content).asInstanceOf[TextView]
val wifiManager = getSystemService(Context.WIFI_SERVICE).asInstanceOf[WifiManager]
val multicastLock = wifiManager.createMulticastLock("myMulticastLock").asInstanceOf[wifiManager.MulticastLock]
multicastLock.setReferenceCounted(true)
multicastLock.acquire
val dataBuffer = new StringBuilder
new UdpClient("230.0.0.1",1234,dataBuffer).execute
multicastLock.release
text.setText(dataBuffer.toString)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment