Class MulticastSocket
- All Implemented Interfaces:
Closeable, AutoCloseable
MulticastSocket is a datagram socket that is
convenient for sending and receiving IP multicast datagrams.
The MulticastSocket constructors create a socket
with appropriate socket options enabled that make
it suitable for receiving multicast datagrams.
The MulticastSocket class additionally defines
convenient setter and getter methods for socket options
that are commonly used by multicasting applications.
Joining one or more multicast groups makes it possible to receive multicast datagrams sent to these groups.
An IPv4 multicast group is specified by a class D IP address
and by a standard UDP port number. Class D IP addresses
are in the range 224.0.0.0 to 239.255.255.255,
inclusive. The address 224.0.0.0 is reserved and should not be used.
One would join a multicast group by first creating a MulticastSocket
with the desired port, then invoking the
joinGroup method, specifying the group address and
the network interface through which multicast datagrams will be
received:
// join a Multicast group and send the group salutations
...
String msg = "Hello";
InetAddress mcastaddr = InetAddress.getByName("228.5.6.7");
InetSocketAddress group = new InetSocketAddress(mcastaddr, 6789);
NetworkInterface netIf = NetworkInterface.getByName("bge0");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(new InetSocketAddress(mcastaddr, 0), netIf);
byte[] msgBytes = msg.getBytes(StandardCharsets.UTF_8);
DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, group);
s.send(hi);
// get their responses!
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
...
// OK, I'm done talking - leave the group...
s.leaveGroup(group, netIf);
When one sends a message to a multicast group, all subscribing
recipients to that host and port receive the message (within the
time-to-live range of the packet, see below). The socket needn't
be a member of the multicast group to send messages to it.
When a socket subscribes to a multicast group/port, it receives datagrams sent by other hosts to the group/port, as do all other members of the group and port. A socket relinquishes membership in a group by the leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) method. Multiple MulticastSockets may subscribe to a multicast group and port concurrently, and they will all receive group datagrams.
The DatagramSocket and MulticastSocket
classes define convenience methods to set and get several
socket options. Like DatagramSocket this class also
supports the setOption
and getOption methods to set
and query socket options.
The set of supported socket options
is defined in DatagramSocket.
Additional (implementation specific) options may also be supported.
- API Note:
DatagramSocketmay be used directly for sending and receiving multicast datagrams.DatagramChannelimplements theMulticastChannelinterface and provides an alternative API for sending and receiving multicast datagrams. TheMulticastChannelAPI supports both any-source and source-specific multicast. Consider usingDatagramChannelfor multicasting.- Since:
- 1.1
-
Constructor Summary
ConstructorsConstructorDescriptionConstructs a multicast socket and binds it to any available port on the local host machine.MulticastSocket(int port) Constructs a multicast socket and binds it to the specified port on the local host machine.MulticastSocket(SocketAddress bindaddr) Creates a multicast socket, bound to the specified local socket address. -
Method Summary
Modifier and TypeMethodDescriptionDeprecated.The network interface may not be uniquely identified by the InetAddress returned.booleanDeprecated.Get the multicast network interface set for outgoing multicast datagrams sent from this socket.intGet the default time-to-live for multicast packets sent out on the socket.voidjoinGroup(InetAddress mcastaddr) Deprecated.This method does not accept the network interface on which to join the multicast group.voidjoinGroup(SocketAddress mcastaddr, NetworkInterface netIf) Joins a multicast group.voidleaveGroup(InetAddress mcastaddr) Deprecated.This method does not accept the network interface on which to leave the multicast group.voidleaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) Leave a multicast group on a specified local interface.voidsetInterface(InetAddress inf) Deprecated.The InetAddress may not uniquely identify the network interface.voidsetLoopbackMode(boolean disable) Deprecated.voidSpecify the network interface for outgoing multicast datagrams sent on this socket.voidsetTimeToLive(int ttl) Set the default time-to-live for multicast packets sent out on thisMulticastSocketin order to control the scope of the multicasts.Methods inherited from class DatagramSocket
bind, close, connect, connect, disconnect, getBroadcast, getChannel, getInetAddress, getLocalAddress, getLocalPort, getLocalSocketAddress, getOption, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, receive, send, setBroadcast, setDatagramSocketImplFactory, setOption, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass, supportedOptionsModifier and TypeMethodDescriptionvoidbind(SocketAddress addr) Binds this DatagramSocket to a specific address and port.voidclose()Closes this datagram socket.voidconnect(InetAddress address, int port) Connects the socket to a remote address for this socket.voidconnect(SocketAddress addr) Connects this socket to a remote socket address (IP address + port number).voidDisconnects the socket.booleanTests if SO_BROADCAST is enabled.Returns the uniqueDatagramChannelobject associated with this datagram socket, if any.Returns the address to which this socket is connected.Gets the local address to which the socket is bound.intReturns the port number on the local host to which this socket is bound.Returns the address of the endpoint this socket is bound to.<T> TgetOption(SocketOption<T> name) Returns the value of a socket option.intgetPort()Returns the port number to which this socket is connected.intGet value of the SO_RCVBUF option for thisDatagramSocket, that is the buffer size, in bytes, used by the platform for input on thisDatagramSocket.Returns the address of the endpoint this socket is connected to, ornullif it is unconnected.booleanTests if SO_REUSEADDR is enabled.intGet value of the SO_SNDBUF option for thisDatagramSocket, that is the buffer size, in bytes, used by the platform for output on thisDatagramSocket.intRetrieve setting for SO_TIMEOUT. 0 returns implies that the option is disabled (i.e., timeout of infinity).intGets traffic class or type-of-service in the IP datagram header for packets sent from this DatagramSocket.booleanisBound()Returns the binding state of the socket.booleanisClosed()Returns whether the socket is closed or not.booleanReturns the connection state of the socket.voidReceives a datagram packet from this socket.voidSends a datagram packet from this socket.voidsetBroadcast(boolean on) Enable/disable SO_BROADCAST.static voidDeprecated.UseDatagramChannel, or subclassDatagramSocketdirectly.<T> DatagramSocketsetOption(SocketOption<T> name, T value) Sets the value of a socket option.voidsetReceiveBufferSize(int size) Sets the SO_RCVBUF option to the specified value for thisDatagramSocket.voidsetReuseAddress(boolean on) Enable/disable the SO_REUSEADDR socket option.voidsetSendBufferSize(int size) Sets the SO_SNDBUF option to the specified value for thisDatagramSocket.voidsetSoTimeout(int timeout) Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds.voidsetTrafficClass(int tc) Sets traffic class or type-of-service octet in the IP datagram header for datagrams sent from this DatagramSocket.Set<SocketOption<?>> Returns a set of the socket options supported by this socket.Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitModifier and TypeMethodDescriptionprotected Objectclone()Creates and returns a copy of this object.booleanIndicates whether some other object is "equal to" this one.protected voidfinalize()Deprecated, for removal: This API element is subject to removal in a future version.Finalization is deprecated and subject to removal in a future release.final Class<?> getClass()Returns the runtime class of thisObject.inthashCode()Returns a hash code value for this object.final voidnotify()Wakes up a single thread that is waiting on this object's monitor.final voidWakes up all threads that are waiting on this object's monitor.toString()Returns a string representation of the object.final voidwait()Causes the current thread to wait until it is awakened, typically by being notified or interrupted.final voidwait(long timeoutMillis) Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.final voidwait(long timeoutMillis, int nanos) Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.
-
Constructor Details
-
MulticastSocket
Constructs a multicast socket and binds it to any available port on the local host machine. The socket will be bound to thewildcardaddress.When the socket is created the
DatagramSocket.setReuseAddress(boolean)method is called to enable the SO_REUSEADDR socket option.- Throws:
IOException- if an I/O exception occurs while creating the MulticastSocket- See Also:
-
MulticastSocket
Constructs a multicast socket and binds it to the specified port on the local host machine. The socket will be bound to thewildcardaddress.When the socket is created the
DatagramSocket.setReuseAddress(boolean)method is called to enable the SO_REUSEADDR socket option.- Parameters:
port- port to use- Throws:
IOException- if an I/O exception occurs while creating the MulticastSocketIllegalArgumentException- if port is out of range.- See Also:
-
MulticastSocket
Creates a multicast socket, bound to the specified local socket address.If the address is
nullan unbound socket will be created.When the socket is created the
DatagramSocket.setReuseAddress(boolean)method is called to enable the SO_REUSEADDR socket option.- Parameters:
bindaddr- Socket address to bind to, ornullfor an unbound socket.- Throws:
IOException- if an I/O exception occurs while creating the MulticastSocket- Since:
- 1.4
- See Also:
-
-
Method Details
-
setTimeToLive
Set the default time-to-live for multicast packets sent out on thisMulticastSocketin order to control the scope of the multicasts.The ttl must be in the range
0 <= ttl <= 255or anIllegalArgumentExceptionwill be thrown. Multicast packets sent with a TTL of0are not transmitted on the network but may be delivered locally.- API Note:
- This method is equivalent to calling
setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl). - Parameters:
ttl- the time-to-live- Throws:
IOException- if an I/O exception occurs while setting the default time-to-live value, or the socket is closed.- Since:
- 1.2
- See Also:
-
getTimeToLive
Get the default time-to-live for multicast packets sent out on the socket.- API Note:
- This method is equivalent to calling
getOption(StandardSocketOptions.IP_MULTICAST_TTL). - Returns:
- the default time-to-live value
- Throws:
IOException- if an I/O exception occurs while getting the default time-to-live value, or the socket is closed.- Since:
- 1.2
- See Also:
-
joinGroup
Deprecated.This method does not accept the network interface on which to join the multicast group. UsejoinGroup(SocketAddress, NetworkInterface)instead.Joins a multicast group. Its behavior may be affected bysetInterfaceorsetNetworkInterface.- API Note:
- Calling this method is equivalent to calling
joinGroup(new InetSocketAddress(mcastaddr, 0), null). - Parameters:
mcastaddr- is the multicast address to join- Throws:
IOException- if there is an error joining, or when the address is not a multicast address, or the platform does not support multicasting, or the socket is closed.
-
leaveGroup
Deprecated.This method does not accept the network interface on which to leave the multicast group. UseleaveGroup(SocketAddress, NetworkInterface)instead.Leave a multicast group. Its behavior may be affected bysetInterfaceorsetNetworkInterface.- API Note:
- Calling this method is equivalent to calling
leaveGroup(new InetSocketAddress(mcastaddr, 0), null). - Parameters:
mcastaddr- is the multicast address to leave- Throws:
IOException- if there is an error leaving or when the address is not a multicast address, or the socket is closed.
-
joinGroup
Joins a multicast group.In order to join a multicast group, the caller should specify the IP address of the multicast group to join, and the local network interface to receive multicast packets from.
- The
mcastaddrargument indicates the IP address of the multicast group to join. For historical reasons this is specified as aSocketAddress. The default implementation only supportsInetSocketAddressand theportinformation is ignored. - The
netIfargument specifies the local interface to receive multicast datagram packets, ornullto defer to the interface set for outgoing multicast datagrams. Ifnull, and no interface has been set, the behaviour is unspecified: any interface may be selected or the operation may fail with aSocketException.
It is possible to call this method several times to join several different multicast groups, or join the same group in several different networks. However, if the socket is already a member of the group, an
IOExceptionwill be thrown.- Overrides:
joinGroupin classDatagramSocket- Parameters:
mcastaddr- indicates the multicast address to join.netIf- specifies the local interface to receive multicast datagram packets, ornull.- Throws:
IOException- if there is an error joining, or when the address is not a multicast address, or the platform does not support multicasting, or the socket is closedIllegalArgumentException- if mcastaddr isnullor is a SocketAddress subclass not supported by this socket- Since:
- 1.4
- See Also:
- The
-
leaveGroup
Leave a multicast group on a specified local interface.- Overrides:
leaveGroupin classDatagramSocket- API Note:
- The
mcastaddrandnetIfarguments should identify a multicast group that was previously joined by thisDatagramSocket.It is possible to call this method several times to leave multiple different multicast groups previously joined, or leave the same group previously joined in multiple different networks. However, if the socket is not a member of the specified group in the specified network, an
IOExceptionwill be thrown. - Parameters:
mcastaddr- is the multicast address to leave. This should contain the same IP address than that used for joining the group.netIf- specifies the local interface ornullto defer to the interface set for outgoing multicast datagrams. Ifnull, and no interface has been set, the behaviour is unspecified: any interface may be selected or the operation may fail with aSocketException.- Throws:
IOException- if there is an error leaving or when the address is not a multicast address, or the socket is closed.IllegalArgumentException- if mcastaddr isnullor is a SocketAddress subclass not supported by this socket.- Since:
- 1.4
- See Also:
-
setInterface
Deprecated.The InetAddress may not uniquely identify the network interface. UsesetNetworkInterface(NetworkInterface)instead.Set the multicast network interface used by methods whose behavior would be affected by the value of the network interface. Useful for multihomed hosts.- Parameters:
inf- the InetAddress- Throws:
SocketException- if there is an error in the underlying protocol, such as a TCP error, or the socket is closed.- See Also:
-
getInterface
Deprecated.The network interface may not be uniquely identified by the InetAddress returned. UsegetNetworkInterface()instead.Retrieve the address of the network interface used for multicast packets.- Returns:
- An
InetAddressrepresenting the address of the network interface used for multicast packets, or if no interface has been set, anInetAddressrepresenting any local address. - Throws:
SocketException- if there is an error in the underlying protocol, such as a TCP error, or the socket is closed.- See Also:
-
setNetworkInterface
Specify the network interface for outgoing multicast datagrams sent on this socket.- API Note:
- This method is equivalent to calling
setOption(StandardSocketOptions.IP_MULTICAST_IF, netIf). - Parameters:
netIf- the interface- Throws:
SocketException- if there is an error in the underlying protocol, such as a TCP error, or the socket is closed.- Since:
- 1.4
- See Also:
-
getNetworkInterface
Get the multicast network interface set for outgoing multicast datagrams sent from this socket.- API Note:
- When an interface is set, this method is equivalent
to calling
getOption(StandardSocketOptions.IP_MULTICAST_IF). - Returns:
- The multicast
NetworkInterfacecurrently set. A placeholder NetworkInterface is returned when there is no interface set; it has a single InetAddress to represent any local address. - Throws:
SocketException- if there is an error in the underlying protocol, such as a TCP error, or the socket is closed.- Since:
- 1.4
- See Also:
-
setLoopbackMode
Deprecated.UseDatagramSocket.setOption(SocketOption, Object)withStandardSocketOptions.IP_MULTICAST_LOOPinstead. The loopback mode is enabled by default,MulticastSocket.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false)disables it.Disable/Enable local loopback of multicast datagrams. The option is used by the platform's networking code as a hint for setting whether multicast data will be looped back to the local socket.Because this option is a hint, applications that want to verify what loopback mode is set to should call
getLoopbackMode()- Parameters:
disable-trueto disable the LoopbackMode- Throws:
SocketException- if an error occurs while setting the value, or the socket is closed.- Since:
- 1.4
- See Also:
-
getLoopbackMode
Deprecated.Get the setting for local loopback of multicast datagrams.- Returns:
- true if the LoopbackMode has been disabled
- Throws:
SocketException- if an error occurs while getting the value, or the socket is closed.- Since:
- 1.4
- See Also:
-