io.vertx.core.datagram.package-info Maven / Gradle / Ivy
/*
* Copyright 2014 Red Hat, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php
*
* You may elect to redistribute this code under either of these licenses.
*/
/**
* == Datagram sockets (UDP)
*
* Using User Datagram Protocol (UDP) with Vert.x is a piece of cake.
*
* UDP is a connection-less transport which basically means you have no persistent connection to a remote peer.
*
* Instead you can send and receive packages and the remote address is contained in each of them.
*
* Beside this UDP is not as safe as TCP to use, which means there are no guarantees that a send Datagram packet will
* receive it's endpoint at all.
*
* The only guarantee is that it will either receive complete or not at all.
*
* Also you usually can't send data which is bigger then the MTU size of your network interface, this is because each
* packet will be send as one packet.
*
* But be aware even if the packet size is smaller then the MTU it may still fail.
*
* At which size it will fail depends on the Operating System etc. So rule of thumb is to try to send small packets.
*
* Because of the nature of UDP it is best fit for Applications where you are allowed to drop packets (like for
* example a monitoring application).
*
* The benefits are that it has a lot less overhead compared to TCP, which can be handled by the NetServer
* and NetClient (see above).
*
* === Creating a DatagramSocket
*
* To use UDP you first need t create a {@link io.vertx.core.datagram.DatagramSocket}. It does not matter here if you only want to send data or send
* and receive.
*
* [source,$lang]
* ----
* {@link examples.DatagramExamples#example1}
* ----
*
* The returned {@link io.vertx.core.datagram.DatagramSocket} will not be bound to a specific port. This is not a
* problem if you only want to send data (like a client), but more on this in the next section.
*
* === Sending Datagram packets
*
* As mentioned before, User Datagram Protocol (UDP) sends data in packets to remote peers but is not connected to
* them in a persistent fashion.
*
* This means each packet can be sent to a different remote peer.
*
* Sending packets is as easy as shown here:
*
* [source,$lang]
* ----
* {@link examples.DatagramExamples#example2}
* ----
*
* === Receiving Datagram packets
*
* If you want to receive packets you need to bind the {@link io.vertx.core.datagram.DatagramSocket} by calling
* `listen(...)}` on it.
*
* This way you will be able to receive {@link io.vertx.core.datagram.DatagramPacket}s that were sent to the address and port on
* which the {@link io.vertx.core.datagram.DatagramSocket} listens.
*
* Beside this you also want to set a `Handler` which will be called for each received {@link io.vertx.core.datagram.DatagramPacket}.
*
* The {@link io.vertx.core.datagram.DatagramPacket} has the following methods:
*
* - {@link io.vertx.core.datagram.DatagramPacket#sender()}: The InetSocketAddress which represent the sender of the packet
* - {@link io.vertx.core.datagram.DatagramPacket#data()}: The Buffer which holds the data which was received.
*
* So to listen on a specific address and port you would do something like shown here:
*
* [source,$lang]
* ----
* {@link examples.DatagramExamples#example3}
* ----
*
* Be aware that even if the {code AsyncResult} is successed it only means it might be written on the network
* stack, but gives no guarantee that it ever reached or will reach the remote peer at all.
*
* If you need such a guarantee then you want to use TCP with some handshaking logic build on top.
*
* === Multicast
*
* ==== Sending Multicast packets
*
* Multicast allows multiple sockets to receive the same packets. This works by have same join a multicast group
* to which you can send packets.
*
* We will look at how you can joint a Multicast Group and so receive packets in the next section.
*
* For now let us focus on how to send those. Sending multicast packets is not different to send normal Datagram Packets.
*
* The only difference is that you would pass in a multicast group address to the send method.
*
* This is show here:
*
* [source,$lang]
* ----
* {@link examples.DatagramExamples#example4}
* ----
*
* All sockets that have joined the multicast group 230.0.0.1 will receive the packet.
*
* ===== Receiving Multicast packets
*
* If you want to receive packets for specific Multicast group you need to bind the {@link io.vertx.core.datagram.DatagramSocket} by
* calling `listen(...)` on it and join the Multicast group.
*
* This way you will be able to receive DatagramPackets that were sent to the address and port on which the
* {@link io.vertx.core.datagram.DatagramSocket} listens and also to those sent to the Multicast group.
*
* Beside this you also want to set a Handler which will be called for each received DatagramPacket.
*
* The {@link io.vertx.core.datagram.DatagramPacket} has the following methods:
*
* - `sender()`: The InetSocketAddress which represent the sender of the packet
* - `data()`: The Buffer which holds the data which was received.
*
* So to listen on a specific address and port and also receive packets for the Multicast group 230.0.0.1 you
* would do something like shown here:
*
* [source,$lang]
* ----
* {@link examples.DatagramExamples#example5}
* ----
*
* ===== Unlisten / leave a Multicast group
*
* There are sometimes situations where you want to receive packets for a Multicast group for a limited time.
*
* In this situations you can first start to listen for them and then later unlisten.
*
* This is shown here:
*
* [source,$lang]
* ----
* {@link examples.DatagramExamples#example6}
* ----
*
* ===== Blocking multicast
*
* Beside unlisten a Multicast address it's also possible to just block multicast for a specific sender address.
*
* Be aware this only work on some Operating Systems and kernel versions. So please check the Operating System
* documentation if it's supported.
*
* This an expert feature.
*
* To block multicast from a specific address you can call `blockMulticastGroup(...)` on the DatagramSocket
* like shown here:
*
* [source,$lang]
* ----
* {@link examples.DatagramExamples#example7}
* ----
*
* ==== DatagramSocket properties
*
* When creating a {@link io.vertx.core.datagram.DatagramSocket} there are multiple properties you can set to
* change it's behaviour with the {@link io.vertx.core.datagram.DatagramSocketOptions} object. Those are listed here:
*
* - {@link io.vertx.core.datagram.DatagramSocketOptions#setSendBufferSize(int)} Sets the send buffer size in bytes.
* - {@link io.vertx.core.datagram.DatagramSocketOptions#setReceiveBufferSize(int)} Sets the TCP receive buffer size
* in bytes.
* - {@link io.vertx.core.datagram.DatagramSocketOptions#setReuseAddress(boolean)} If true then addresses in TIME_WAIT
* state can be reused after they have been closed.
* - {@link io.vertx.core.datagram.DatagramSocketOptions#setTrafficClass(int)}
* - {@link io.vertx.core.datagram.DatagramSocketOptions#setBroadcast(boolean)} Sets or clears the SO_BROADCAST socket
* option. When this option is set, Datagram (UDP) packets may be sent to a local interface's broadcast address.
* - {@link io.vertx.core.datagram.DatagramSocketOptions#setMulticastNetworkInterface(java.lang.String)} Sets or clears
* the IP_MULTICAST_LOOP socket option. When this option is set, multicast packets will also be received on the
* local interface.
* - {@link io.vertx.core.datagram.DatagramSocketOptions#setMulticastTimeToLive(int)} Sets the IP_MULTICAST_TTL socket
* option. TTL stands for "Time to Live," but in this context it specifies the number of IP hops that a packet is
* allowed to go through, specifically for multicast traffic. Each router or gateway that forwards a packet decrements
* the TTL. If the TTL is decremented to 0 by a router, it will not be forwarded.
*
* ==== DatagramSocket Local Address
*
* You can find out the local address of the socket (i.e. the address of this side of the UDP Socket) by calling
* {@link io.vertx.core.datagram.DatagramSocket#localAddress()}. This will only return an `InetSocketAddress` if you
* bound the {@link io.vertx.core.datagram.DatagramSocket} with `listen(...)` before, otherwise it will return null.
*
* ==== Closing a DatagramSocket
*
* You can close a socket by invoking the {@link io.vertx.core.datagram.DatagramSocket#close} method. This will close
* the socket and release all resources
*/
@Document(fileName = "datagrams.adoc")
package io.vertx.core.datagram;
import io.vertx.docgen.Document;