On Tue, 26 Nov 2024 10:33:21 GMT, Daniel Fuchs <dfu...@openjdk.org> wrote:
>> test/jdk/java/net/Socket/CloseOnFailureTest.java line 345: >> >>> 343: SocketAddress serverSocketAddress = >>> serverSocket().getLocalSocketAddress(); >>> 344: try (Socket socket = >>> createConnectedSocket(serverSocketAddress)) { >>> 345: assertReconnectFailure(() -> >>> socket.connect(REFUSING_SOCKET_ADDRESS)); >> >> I needed to delegate the assertion to the implementation because when I call >> `connect()` on a `Socket` created using >> `SocketChannel.open(address).socket()` and `new Socket(address, port)`, the >> former throws an `AlreadyConnectedException`, whereas the latter throws a >> `SocketException`. Is this discrepancy expected? > > There are some subtle behaviour discrepancies between plain Socket (created > with new Socket()) and the SocketAdaptor (created from > SocketChannel.socket()). SocketChannel::connect will throw > AlreadyConnectedException, and so that's what the socket adaptor also does. > Ideally we'd want to reduce the distance between plain Socket and the Socket > adaptor - but changing behaviours in these APIs is always tricky and a bit > risky (and can require a lot of efforts). FWIW - SocketChannel does the right > thing - but we're stuck with SocketException in the Socket API due to > compatibility reason. Got it. Thanks for the explanation. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/22160#discussion_r1858251746