@SuppressWarnings("RedundantThrows") // Thrown through rethrowFunction
  short getServerVersion(final @NotNull HostAndPort address, final int timeout) throws IOException {
    return computeIfAbsent(serverVersions, address, rethrowFunction((k) -> {
      final Socket socket =
          socketCreator.forCluster().connect(address, timeout, null, socketFactory);
      try {
        socket.setSoTimeout(timeout);
        return getServerVersion(socket);
      } finally {
        resetSocketAndLogExceptions(socket);
      }
    }));
  }
Send a request to a Locator

@param address The locator's address
@param request The request message
@param timeout Timeout for sending the message and receiving a reply
@param replyExpected Whether to wait for a reply
@return The reply, or null if no reply is expected. This may also return a null
        if we're unable to form a connection to the TcpServer before the given timeout elapses
@throws ClassNotFoundException if the deserializer throws this exception
@throws IOException if there is a problem interacting with the server
geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java