Packages

trait UDPDatagramSocket extends AutoCloseable

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 the UDPDatagramSocket 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))
Linear Supertypes
AutoCloseable, AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. UDPDatagramSocket
  2. AutoCloseable
  3. AnyRef
  4. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Abstract Value Members

  1. abstract def address: IPAddress

    The local address to which the socket is bound.

    The local address to which the socket is bound.

    returns

    the address

  2. abstract 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

  3. abstract 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.

  4. abstract def close(): Unit

    Close the socket.

    Close the socket.

    Definition Classes
    UDPDatagramSocket → AutoCloseable
  5. abstract def port: Int

    The local port to which the socket is bound.

  6. abstract 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

  7. abstract 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

Concrete Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  5. def clone(): AnyRef
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @native() @throws( ... )
  6. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  7. def equals(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  8. def finalize(): Unit
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  9. final def getClass(): Class[_]
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  10. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  11. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  12. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  13. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  14. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  15. 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 of receive() 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.

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. final def synchronized[T0](arg0: ⇒ T0): T0
    Definition Classes
    AnyRef
  23. def toString(): String
    Definition Classes
    AnyRef → Any
  24. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  25. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  26. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @throws( ... )

Inherited from AutoCloseable

Inherited from AnyRef

Inherited from Any

Ungrouped