public function getServers($regionCode = MasterServer::REGION_ALL , $filter = '', $force = false) {
        $failCount   = 0;
        $finished    = false;
        $portNumber  = 0;
        $hostName    = '0.0.0.0';
        $serverArray = [];

        while(true) {
            $failCount = 0;
            try {
                do {
                    $this->socket->send(new A2MGETSERVERSBATCH2Packet($regionCode, "$hostName:$portNumber", $filter));
                    try {
                        $serverStringArray = $this->socket->getReply()->getServers();

                        foreach($serverStringArray as $serverString) {
                            $serverString = explode(':', $serverString);
                            $hostName = $serverString[0];
                            $portNumber = $serverString[1];

                            if($hostName != '0.0.0.0' && $portNumber != 0) {
                                $serverArray[] = [$hostName, $portNumber];
                            } else {
                                $finished = true;
                            }
                        }
                        $failCount = 0;
                    } catch(TimeoutException $e) {
                        $failCount ++;
                        if($failCount == self::$retries) {
                            throw $e;
                        }
                        $this->logger->info("Request to master server {$this->ipAddress} timed out, retrying...");
                    }
                } while(!$finished);
                break;
            } catch(TimeoutException $e) {
                if ($this->rotateIp()) {
                    if ($force) {
                        break;
                    }
                    throw $e;
                }
                $this->logger->info("Request to master server failed, retrying {$this->ipAddress}...");
            }
        }

        return array_unique($serverArray, SORT_REGULAR);
    }