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))
- Alphabetic
- By Inheritance
- UDPDatagramSocket
- AutoCloseable
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Abstract Value Members
-
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
-
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
-
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.
-
abstract
def
close(): Unit
Close the socket.
Close the socket.
- Definition Classes
- UDPDatagramSocket → AutoCloseable
-
abstract
def
port: Int
The local port to which the socket is bound.
-
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
-
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
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
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.
-
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
-
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
-
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
-
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
-
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
-
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
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @throws( ... )