RFR: 8237352: Evaluate how to write a custom DatagramSocket/MulticastSocket without using DatagramSocketImplFactory [v6]

Daniel Fuchs dfuchs at openjdk.java.net
Mon Feb 1 16:56:03 UTC 2021


> DatagramSocket has a DatagramSocket.setDatagramSocketImplFactory method that allows to globally replace the default DatagramSocket/MulticastSocket implementation provided by the JDK. This was provided as a way in early JDK releases to replace the system wide implementation. It has been mostly obsolete since Java 1.4. A DatagramSocket can be 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 proposes 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
> 
> CSR:
> https://bugs.openjdk.java.net/browse/JDK-8260667

Daniel Fuchs has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains ten additional commits since the last revision:

 - Integrated review comments.
 - Merge branch 'master' into ds-ms-8237352
 - Integrated review comments.
 - Fixup @bug in the tests
 - Fixup @see for leaveGroup
 - Restore @apiNote for leaveGroup
 - Overrides in MulticastSocket don't need the @apiNote
 - 8237352: Evaluate how to write a custom DatagramSocket/MulticastSocket without using DatagramSocketImplFactory
 - 8237352: Evaluate how to write a custom DatagramSocket/MulticastSocket without using DatagramSocketImplFactory

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

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/2312/files
  - new: https://git.openjdk.java.net/jdk/pull/2312/files/da9a5862..83dda0b3

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2312&range=05
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2312&range=04-05

  Stats: 2816 lines in 110 files changed: 1459 ins; 968 del; 389 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


More information about the net-dev mailing list