По сути та же идея, что и у Караси, но вместо создания такого количества сокетов, используйте InetSocketAddress и пытайтесь привязать ServerSocket к каждому адресу в диапазоне, пока не дойдете до открытого.
Если вы не хотите привязываться к этому порту (хотя, если вы этого не сделаете, сокет может также быть привязан в следующий момент после проверки), используйте обычный объект Socket и попробуйте подключиться к портам - если он работает, порт занят, если нет (и у вас нет брандмауэра, запрещающего соединение), то, скорее всего, он свободен.