grizzled.net

UDPDatagramSocket

trait UDPDatagramSocket extends AnyRef

A UDPDatagramSocket object represents a UDP datagram socket, providing a simpler interface to sending and receiving UDP packets than the one provided by the Java JDK.

Sending UDP Datagrams

The easiest way to explain how to use this API is with some code. So, without further ado, the following example shows how you might send the string "foo" to port 2003 on host "foo.example.com".

// Import the appropriate stuff.
import grizzled.net._

// First, create an grizzled.net.IPAddress object for the destination
// machine.
val address = IPAddress("foo.example.com")

// Next, create the socket object. Since we're sending the packet,
// we don't care what the local port is. By not specifying one, we allow
// the operating system to choose one one for us. Similarly, by not
// passing an explicit address, we indicate that the API should bind to a
// wildcard address, so that the packet can go out over any appropriate
// interface.
val socket = UDPDatagramSocket()

// Next, use the sendString() method to send the string
socket.sendString("foo", address, 2003)

// Finally, close the socket.
socket.close()

That's pretty simple. However, using the utility methods provided by theUDPDatagramSocket companion object, we can further simplify the above code:

// Import the appropriate stuff.
import grizzled.net._

UDPDatagramSocket.sendString("foo", IPAddress("foo.example.com"), 2003)

The sendString() method in the companion object takes care of allocating the socket, sending the packet, and closing the socket. Obviously, if you're planning on sending multiple packets at once, you'll want to use the first example (perhaps in a loop), so you're not constantly allocating and deallocating sockets. But sending a one-shot UDP packet can be as simple as one line of code, as shown in the second example.

Sending binary data is not much more complicated. You have to convert the data to a stream of bytes, which the server must then decode. After that, however, sending the bytes isn't much more difficult than sending a string. Here's an example, which assumes that you have already encoded the data to be send into an array of bytes.

// Import the appropriate stuff.
import grizzled.net._

// Encode the data into bytes. (Not shown.)
val data: Array[Byte] = encodeTheData()

// Create the socket object.
val socket = UDPDatagramSocket()

// Send the data.
socket.send(data, IPAddress("foo.example.com"), 2003)

// Finally, close the socket.
socket.close()

Once again, there's a simple utility method that does most of the work for you:

// Import the appropriate stuff.
import grizzled.net._

// Encode the data into bytes. (Not shown.)
val data: Array[Byte] = encodeTheData()

// Send the data.
UDPDatagramSocket.send(data, IPAddress("foo.example.com"), 2003)

Receiving UDP Datagrams

When receiving UDP datagrams, you must first bind to an incoming socket. That is, you must listen on the port to which clients are sending their packets. In this example, we create the socket object with the receiving port, and we allow the wildcard address to be used on the local machine (permitting us to receive packets on any interface).

// Import the appropriate stuff.
import grizzled.net._

// Create the socket object.
val socket = UDPDatagramSocket(2003)

Next, we want to receive and process the incoming data. Let's assume that we're receiving the "foo" string (or, for that matter, any string) being sent by the sample sender, above.

// Receive and print strings.
while (true)
    println(socket.receiveString(1024))

That code says, "Wait for incoming strings, using a 1024-byte buffer. Then, decode the strings and print them to standard output.

Receiving bytes isn't much more difficult.

// Allocate a byte buffer. For efficiency, we'll re-use the same buffer
// on every incoming message.
val buf = Array.make[Byte](1024, 0)

// Receive and process the incoming bytes. The process() method isn't
// shown.
while (true)
{
    val totalRead = socket.receive(buf)
    process(buf, totalRead)
}

The above loop can be made even simpler (though a little more obscure), since the receive() method is filling our buffer and returning a count of the number of bytes it put into the buffer:

while (true)
    process(buf, socket.receive(buf))
go to: companion
linear super types: AnyRef, Any
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. Hide All
  2. Show all
  1. UDPDatagramSocket
  2. AnyRef
  3. Any
Visibility
  1. Public
  2. All
Impl.
  1. Concrete
  2. Abstract

Value Members

  1. def != (arg0: AnyRef) : Boolean

    attributes: final
    definition classes: AnyRef
  2. def != (arg0: Any) : Boolean

    o != arg0 is the same as !(o == (arg0)).

    o != arg0 is the same as !(o == (arg0)).

    arg0

    the object to compare against this object for dis-equality.

    returns

    false if the receiver object is equivalent to the argument; true otherwise.

    attributes: final
    definition classes: Any
  3. def ## () : Int

    attributes: final
    definition classes: AnyRef → Any
  4. def $asInstanceOf [T0] () : T0

    attributes: final
    definition classes: AnyRef
  5. def $isInstanceOf [T0] () : Boolean

    attributes: final
    definition classes: AnyRef
  6. def == (arg0: AnyRef) : Boolean

    o == arg0 is the same as if (o eq null) arg0 eq null else o.equals(arg0).

    o == arg0 is the same as if (o eq null) arg0 eq null else o.equals(arg0).

    arg0

    the object to compare against this object for equality.

    returns

    true if the receiver object is equivalent to the argument; false otherwise.

    attributes: final
    definition classes: AnyRef
  7. def == (arg0: Any) : Boolean

    o == arg0 is the same as o.equals(arg0).

    o == arg0 is the same as o.equals(arg0).

    arg0

    the object to compare against this object for equality.

    returns

    true if the receiver object is equivalent to the argument; false otherwise.

    attributes: final
    definition classes: Any
  8. def address : IPAddress

    The local address to which the socket is bound.

    The local address to which the socket is bound.

    attributes: abstract
  9. def asInstanceOf [T0] : T0

    This method is used to cast the receiver object to be of type T0.

    This method is used to cast the receiver object to be of type T0.

    Note that the success of a cast at runtime is modulo Scala's erasure semantics. Therefore the expression1.asInstanceOf[String] will throw a ClassCastException at runtime, while the expressionList(1).asInstanceOf[List[String]] will not. In the latter example, because the type argument is erased as part of compilation it is not possible to check whether the contents of the list are of the requested typed.

    returns

    the receiver object.

    attributes: final
    definition classes: Any
  10. def broadcast : Boolean

    Whether or not the socket's broadcast flag is set.

    Whether or not the socket's broadcast flag is set. The broadcast flag corresponds to the SO_BROADCAST socket option. When this option is enabled, datagram sockets will receive packets sent to a broadcast address, and they are permitted to send packets to a broadcast address.

    returns

    whether or not the broadcast flag is set

    attributes: abstract
  11. def broadcast_= (enable: Boolean) : Unit

    Change the value of the socket's broadcast flag.

    Change the value of the socket's broadcast flag. The broadcast flag corresponds to the SO_BROADCAST socket option. When this option is enabled, datagram sockets will receive packets sent to a broadcast address, and they are permitted to send packets to a broadcast address.

    enable

    true to enable broadcast, false to disable it.

    attributes: abstract
  12. def clone () : AnyRef

    This method creates and returns a copy of the receiver object.

    This method creates and returns a copy of the receiver object.

    The default implementation of the clone method is platform dependent.

    returns

    a copy of the receiver object.

    attributes: protected
    definition classes: AnyRef
  13. def close () : Unit

    Close the socket.

    Close the socket.

    attributes: abstract
  14. def eq (arg0: AnyRef) : Boolean

    This method is used to test whether the argument (arg0) is a reference to the receiver object (this).

    This method is used to test whether the argument (arg0) is a reference to the receiver object (this).

    The eq method implements an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation] on non-null instances of AnyRef: * It is reflexive: for any non-null instance x of type AnyRef, x.eq(x) returns true. * It is symmetric: for any non-null instances x and y of type AnyRef, x.eq(y) returns true if and only if y.eq(x) returns true. * It is transitive: for any non-null instances x, y, and z of type AnyRef if x.eq(y) returns true and y.eq(z) returns true, then x.eq(z) returns true.

    Additionally, the eq method has three other properties. * It is consistent: for any non-null instances x and y of type AnyRef, multiple invocations of x.eq(y) consistently returns true or consistently returns false. * For any non-null instance x of type AnyRef, x.eq(null) and null.eq(x) returns false. * null.eq(null) returns true.

    When overriding the equals or hashCode methods, it is important to ensure that their behavior is consistent with reference equality. Therefore, if two objects are references to each other (o1 eq o2), they should be equal to each other (o1 == o2) and they should hash to the same value (o1.hashCode == o2.hashCode).

    arg0

    the object to compare against this object for reference equality.

    returns

    true if the argument is a reference to the receiver object; false otherwise.

    attributes: final
    definition classes: AnyRef
  15. def equals (arg0: Any) : Boolean

    This method is used to compare the receiver object (this) with the argument object (arg0) for equivalence.

    This method is used to compare the receiver object (this) with the argument object (arg0) for equivalence.

    The default implementations of this method is an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]: * It is reflexive: for any instance x of type Any, x.equals(x) should return true. * It is symmetric: for any instances x and y of type Any, x.equals(y) should return true if and only if y.equals(x) returns true. * It is transitive: for any instances x, y, and z of type AnyRef if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.

    If you override this method, you should verify that your implementation remains an equivalence relation. Additionally, when overriding this method it is often necessary to override hashCode to ensure that objects that are "equal" (o1.equals(o2) returns true) hash to the same scala.Int (o1.hashCode.equals(o2.hashCode)).

    arg0

    the object to compare against this object for equality.

    returns

    true if the receiver object is equivalent to the argument; false otherwise.

    definition classes: AnyRef → Any
  16. def finalize () : Unit

    This method is called by the garbage collector on the receiver object when garbage collection determines that there are no more references to the object.

    This method is called by the garbage collector on the receiver object when garbage collection determines that there are no more references to the object.

    The details of when and if the finalize method are invoked, as well as the interaction between finalizeand non-local returns and exceptions, are all platform dependent.

    attributes: protected
    definition classes: AnyRef
  17. def getClass () : java.lang.Class[_]

    Returns a representation that corresponds to the dynamic class of the receiver object.

    Returns a representation that corresponds to the dynamic class of the receiver object.

    The nature of the representation is platform dependent.

    returns

    a representation that corresponds to the dynamic class of the receiver object.

    attributes: final
    definition classes: AnyRef
  18. def hashCode () : Int

    Returns a hash code value for the object.

    Returns a hash code value for the object.

    The default hashing algorithm is platform dependent.

    Note that it is allowed for two objects to have identical hash codes (o1.hashCode.equals(o2.hashCode)) yet not be equal (o1.equals(o2) returns false). A degenerate implementation could always return 0. However, it is required that if two objects are equal (o1.equals(o2) returns true) that they have identical hash codes (o1.hashCode.equals(o2.hashCode)). Therefore, when overriding this method, be sure to verify that the behavior is consistent with the equals method.

    returns

    the hash code value for the object.

    definition classes: AnyRef → Any
  19. def isInstanceOf [T0] : Boolean

    This method is used to test whether the dynamic type of the receiver object is T0.

    This method is used to test whether the dynamic type of the receiver object is T0.

    Note that the test result of the test is modulo Scala's erasure semantics. Therefore the expression1.isInstanceOf[String] will return false, while the expression List(1).isInstanceOf[List[String]] will return true. In the latter example, because the type argument is erased as part of compilation it is not possible to check whether the contents of the list are of the requested typed.

    returns

    true if the receiver object is an instance of erasure of type T0; false otherwise.

    attributes: final
    definition classes: Any
  20. def ne (arg0: AnyRef) : Boolean

    o.ne(arg0) is the same as !(o.eq(arg0)).

    o.ne(arg0) is the same as !(o.eq(arg0)).

    arg0

    the object to compare against this object for reference dis-equality.

    returns

    false if the argument is not a reference to the receiver object; true otherwise.

    attributes: final
    definition classes: AnyRef
  21. def notify () : Unit

    Wakes up a single thread that is waiting on the receiver object's monitor.

    Wakes up a single thread that is waiting on the receiver object's monitor.

    attributes: final
    definition classes: AnyRef
  22. def notifyAll () : Unit

    Wakes up all threads that are waiting on the receiver object's monitor.

    Wakes up all threads that are waiting on the receiver object's monitor.

    attributes: final
    definition classes: AnyRef
  23. def port : Int

    The local port to which the socket is bound.

    The local port to which the socket is bound.

    attributes: abstract
  24. def receive (length: Int) : (Array[Byte], Int)

    Receive a buffer of bytes from the socket.

    Receive a buffer of bytes from the socket. The buffer is dynamically allocated and returned. For more efficiency, use the version ofreceive() that takes a caller-supplied buffer.

    length

    maximum number of bytes to receive

    returns

    a tuple containing the buffer of data (of size length) and the actual number of bytes read. The buffer might be longer than the number of bytes read.

  25. def receive (buf: Array[Byte]) : Int

    Receive a buffer of bytes from the socket, writing them into a caller-supplied fixed-size buffer.

    Receive a buffer of bytes from the socket, writing them into a caller-supplied fixed-size buffer. One simple way to create such a buffer:

    // Create a 512-byte buffer initialized to zeros.
    val buf = Array.make[Byte](512, 0)
    
    buf

    the buf into which to read the data

    returns

    actual number of bytes read

    attributes: abstract
  26. def receiveString (buf: Array[Byte]) : String

    Receive a string from the socket, using a caller-supplied receive buffer to hold the bytes actually received over the wire.

    Receive a string from the socket, using a caller-supplied receive buffer to hold the bytes actually received over the wire. The string is assumed to have been encoded in UTF-8 for transmission and is decoded accordingly.

    buf

    the buf into which to read the data

    returns

    the string

  27. def receiveString (buf: Array[Byte], encoding: String) : String

    Receive a string from the socket, using a caller-supplied receive buffer to hold the bytes actually received over the wire.

    Receive a string from the socket, using a caller-supplied receive buffer to hold the bytes actually received over the wire. The string is assumed to have been encoded in the specified encoding and is decoded accordingly.

    buf

    the buf into which to read the data

    encoding

    the encoding to use when decoding the string

    returns

    the string

  28. def receiveString (length: Int) : String

    Receive a string from the socket.

    Receive a string from the socket. The string is assumed to have been encoded in UTF-8 for transmission and is decoded accordingly.

    length

    maximum number of bytes (not characters) expected

    returns

    the string

  29. def receiveString (length: Int, encoding: String) : String

    Receive a string from the socket.

    Receive a string from the socket. The string is assumed to have been encoded in the specified encoding and is decoded accordingly.

    length

    maximum number of bytes (not characters) expected

    encoding

    the encoding to use when decoding the string

    returns

    the string

  30. def send (data: Seq[Byte], address: IPAddress, port: Int) : Unit

    Send data over the socket.

    Send data over the socket. Accepts any sequence of bytes (e.g.,Array[Byte], List[Byte]).

    data

    the bytes to send

    attributes: abstract
  31. def sendString (data: String, address: IPAddress, port: Int) : Unit

    Send string data over the socket.

    Send string data over the socket. Converts the string to UTF-8 bytes, then sends the bytes.

    data

    the string to send

    address

    the IP address to receive the string

    port

    the destination port on the remote machine

  32. def sendString (data: String, encoding: String, address: IPAddress, port: Int) : Unit

    Send string data over the socket.

    Send string data over the socket. The internal UTF-16 strings are converted to the specified encoding before being sent.

    data

    the string to send

    encoding

    the encoding to use

    address

    the IP address to receive the string

    port

    the destination port on the remote machine

  33. def synchronized [T0] (arg0: T0) : T0

    attributes: final
    definition classes: AnyRef
  34. def toString () : String

    Returns a string representation of the object.

    Returns a string representation of the object.

    The default representation is platform dependent.

    returns

    a string representation of the object.

    definition classes: AnyRef → Any
  35. def wait () : Unit

    attributes: final
    definition classes: AnyRef
  36. def wait (arg0: Long, arg1: Int) : Unit

    attributes: final
    definition classes: AnyRef
  37. def wait (arg0: Long) : Unit

    attributes: final
    definition classes: AnyRef

Inherited from AnyRef

Inherited from Any