DatagramSocket has a DatagramSocket.setDatagramSocketImplFactory method that 
allows to globally replace the default DatagramSocket/MulticastSocket 
implementation provided by the JDK. This was provided a way in early JDK 
releases to replace the system wide implementation. It has been mostly obsolete 
since Java 1.4. A DatagramSocket can created to use a custom implementation by 
extending DatagramSocket and using the protected constructor that takes the 
impl as a parameter. However, MulticastSocket doesn't provide such a 
constructor.

Though DatagramSocket can be subclassed to provide a custom implementation, 
MulticastSocket, if subclassed, will still create its default implementation, 
even when all methods of MulticastSocket are overridden in order not to use it. 
This will create a file descriptor / socket leak.

The only solution to avoid that is currently to replace the default 
DatagramSocketImplFactory by calling the static 
DatagramSocket.setDatagramSocketImplFactory. We need a better solution.

The solution proposed in this RFE is to allow DatagramSocket to both send and 
receive multicast datagrams. DatagramSocket has always had the ability to send 
multicast packets. In Java 15, DatagramSocket has been improved to support 
getting/setting multicast options. This change propose to move 
`joinGroup(SocketAddress, NetworkInterface)` and `leaveGroup(SocketAddress, 
NetworkInterface)` up from MulticastSocket into DatagramSocket.

An application that needs to completely replace the default multicast 
implementation, and that cannot be easily updated to use DatagramChannel, can 
do so by subclassing DatagramSocket instead.

In addition, this change improves the documentation of DatagramSocket and 
MulticastSocket to show how convenience getters/setters map to 
StandardSocketOptions, and adds an `@apiNote` to show how DatagramSocket can be 
used for multicasting.

Specdiff can be seen here:
http://cr.openjdk.java.net/~dfuchs/ds-ms-8237352-specdiff.07/overview-summary.html

-------------

Commit messages:
 - 8237352: Evaluate how to write a custom DatagramSocket/MulticastSocket 
without using DatagramSocketImplFactory

Changes: https://git.openjdk.java.net/jdk/pull/2312/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2312&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8237352
  Stats: 981 lines in 5 files changed: 867 ins; 66 del; 48 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2312.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2312/head:pull/2312

PR: https://git.openjdk.java.net/jdk/pull/2312

Reply via email to