diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java index 9f151913067..f5157d03049 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java @@ -351,9 +351,10 @@ public void initChannel(SocketChannel ch) { return bootstrap; } - // Do not use RemotingUtil, it will directly resolve the domain + // Do not use RemotingHelper.string2SocketAddress(), it will directly resolve the domain private String[] getHostAndPort(String address) { - return address.split(":"); + int split = address.lastIndexOf(":"); + return split < 0 ? new String[]{address} : new String[]{address.substring(0, split), address.substring(split + 1)}; } @Override diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyRemotingClientTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyRemotingClientTest.java index 1cc6b4f4687..456e7ecdd59 100644 --- a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyRemotingClientTest.java +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyRemotingClientTest.java @@ -16,9 +16,12 @@ */ package org.apache.rocketmq.remoting.netty; +import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.local.LocalChannel; + +import java.lang.reflect.Field; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -50,6 +53,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -290,4 +294,16 @@ public void testInvokeImplFail() { verify(rpcHookMock).doBeforeRequest(anyString(), eq(request)); verify(rpcHookMock, never()).doAfterResponse(anyString(), eq(request), any()); } + + @Test + public void testIsAddressReachableFail() throws NoSuchFieldException, IllegalAccessException { + Bootstrap bootstrap = spy(Bootstrap.class); + Field field = NettyRemotingClient.class.getDeclaredField("bootstrap"); + field.setAccessible(true); + field.set(remotingClient, bootstrap); + assertThat(remotingClient.isAddressReachable("0.0.0.0:8080")).isFalse(); + verify(bootstrap).connect(eq("0.0.0.0"), eq(8080)); + assertThat(remotingClient.isAddressReachable("[fe80::]:8080")).isFalse(); + verify(bootstrap).connect(eq("[fe80::]"), eq(8080)); + } }