# Instalación y uso

En este punto, debes tener a la mano tu **NetsocksID**, lo necesitarás para inicializar el SDK.

## Inicializar SDK

{% hint style="info" %}
Recuerda que tu **NetsocksID** se encuentra en el portal de netsocks. Para visualizarla consulta la sección [Publisher Key](https://docs.netsocks.io/spanish/portal/publisher-key).
{% endhint %}

Nuestra recomendación es inicializar el SDK en la clase `Application` de la app para garantizar los mejores resultados de funcionamiento, aunque también se puede realizar en algún `Activity` principal. Utiliza el siguiente código en el método `onCreate` :

{% tabs %}
{% tab title="Java" %}

```java
VpnSdk.initialize(this, "NetsocksID");
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
VpnSdk.initialize(this, "NetsocksID")
```

{% endtab %}
{% endtabs %}

La inicialización del SDK puede demorar un poco más que el flujo natural de tu aplicación, debes tenerlo en cuenta antes de utilizar cualquier método del SDK, de lo contrario se generará un error.

### Escuchar la inicialización del SDK

Puedes escuchar cuando el SDK se inicialice desde cualquier parte de tu aplicación utilizando el método `VpnSdk.wait(...)`, o hacerlo al mismo tiempo que llamas al método `.initialize(...)`&#x20;

* Si utilizaste `.initialize()` en la clase `Application`, `SplashActivity` u otra actividad principal en la que no hayas esperado la inicialización del SDK y deseas saber de manera posterior el momento en el que el SDK fue inicializado, puedes utilzar `VpnSdk.wait()`:

{% tabs %}
{% tab title="Java" %}

<pre class="language-java"><code class="lang-java"><strong>VpnSdk.wait((result) -> {
</strong>    // if(result) myConnectButton.enabled = true (Activar botón de conexión)
    return Unit.INSTANCE;
});
</code></pre>

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
VpnSdk.wait() { result ->
    // if(result) myConnectButton.enabled = true (Activar botón de conexión)
    return Unit.INSTANCE;
}
```

{% endtab %}
{% endtabs %}

## Obtener lista de servidores

Una vez que el SDK se inicializó con éxito, puedes traer la lista de servidores disponibles haciendo uso del método `getServersList()`

{% tabs %}
{% tab title="Java" %}

```java
VpnSdk.INSTANCE.getServerList(new ResultCallback<List<Server>>() {
    @Override
    public void onResult(List<Server> servers) {
        // for each server you can
        Server server = servers.get(0);
        int latency = server.getServerLatency();
        String country = server.getCountry();
        Float serverLoadPercentage = server.getLoad();
        int availableSeats = server.getSlots();
    }

    @Override
    public void onError(@NonNull Throwable throwable) {

    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
        viewModelScope.launch {
            val countryList = runCatching { VpnSdk.getServerList() }

            countryList.onFailure {
                it.printStackTrace()
                // Ejemplo: Mostrar un error (toast, etc).
            }

            countryList.onSuccess {
                // Ejemplo: actualizar lista de servidores (MutableLiveData)
                // Por cada servidor puedes obtener:
                val country = it.country // código de país
                val pingMs = it.latency // latencia del servidor en milisegundos
                val serverLoadPercentage = it.load // carga del servidor, de 0.0 a 99.9%
                val availableSlots = it.slots // Cuantos usuarios pueden conectarse
            }
        }
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Algunos campos a excepción de "country" pueden no estar disponibles para todos los servidores o para ninguno en absoluto. Toma las precauciones necesarias.
{% endhint %}

## Conectar a un servidor

Antes de poder iniciar la conexión a un servidor, tienes que declarar el vpnManager, puedes hacerlo en tu fragmento o activity de la siguiente manera:

{% tabs %}
{% tab title="Java" %}

```java
import io.netsocks.vpn.VpnManager
// class VpnFragment : Fragment(R.layout.fragment_vpn) {
// ...
    private final VpnManager vpnManager = new VpnManager(this);
// ...
```

{% endtab %}

{% tab title="Kotlin" %}

<pre class="language-kotlin"><code class="lang-kotlin">import io.netsocks.vpn.VpnManager
// class VpnFragment : Fragment(R.layout.fragment_vpn) {
// ...
<strong>        private val vpnManager = VpnManager(this)
</strong>// ...
</code></pre>

{% endtab %}
{% endtabs %}

Cuando hayas declarado el vpnManager y hayas obtenido la lista de países, puedes iniciar la conexión de la siguiente manera:

{% tabs %}
{% tab title="Java" %}

```java
NotificationSettings notificationSettings = new NotificationSettings(
        "title", // titulo de la notificación
        "content", // contenido de la notificación
        "disconnectButtonText" // texto del botón desconectar
);

ConnectionSettings config = new ConnectionSettings(
        notificationSettings, 
        "MX" // código de país
);
vpnManager.connect(config); // iniciar conexión
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val config = ConnectionSettings(
    country = "MX", // Código de país, XX
    notificationSettings = NotificationSettings("Netsocks", "servicio vpn") // Ejemplo
)

vpnManager.connect(config) // iniciar conexión
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Recuerda conectar el usuario solo a servidores disponibles previamente obtenidos de la lista de países.
{% endhint %}

Para desconectar al usuario del servidor, tienes que llamar el método `disconnect`.

{% tabs %}
{% tab title="Java" %}

<pre class="language-java"><code class="lang-java"><strong>vpnManager.disconnect(); // cerrar conexión
</strong></code></pre>

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
vpnManager.disconnect(); // cerrar conexión
```

{% endtab %}
{% endtabs %}

Recuerda revisar la sección de consentimiento para obtener más información respecto a qué puedes hacer si el usuario opta por no utilizar el SDK de netsocks.

## Modificar el comportamiento del Túnel

Puedes modificar el comportamiento del tunel haciendo uso del método setTunnelingMode, este método le dirá a la VPN como enrutar el tráfico del dispositivo. Los modos de operación disponibles son:

Los modos de operación disponibles para configurar a través del método `setTunnelingMode` son:

* **`KILL_SWITCH`**: En este modo, todo el tráfico de Internet del dispositivo se enruta a través del túnel VPN, proporcionando una capa completa de seguridad y privacidad. Es el modo recomendado para usuarios que desean cifrar todo su tráfico de Internet.
* **ONLY\_ADDED\_APPS**: En este modo, solo se enrutará el tráfico de internet de las aplicaciones que hayas añadido utilizando el método `VpnSdk.addApp`.
* **ONLY\_NOT\_ADDED\_APPS**: Este modo enrutará el tráfico de todas aquellas aplicaciones que no hayas añadido utilizando el método `VpnSdk.addApp`.

Para establecer el modo de operación del túnel, utiliza el siguiente código:

{% tabs %}
{% tab title="Java" %}

```java
VpnSdk.INSTANCE.setTunnelingMode(TunnelMode.MODE); // Reemplaza MODE Según corresponda.
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
VpnSdk.setTunnelingMode(TunnelMode.MODE); // Reemplaza MODE Según corresponda.
```

{% endtab %}
{% endtabs %}

Para controlar selectivamente el tráfico de qué aplicaciones se enruta a través de la VPN, puedes usar los métodos `VpnSdk.addApp` y `VpnSdk.removeApp`. Esto permite una experiencia VPN más personalizada, enfocándose en aplicaciones específicas en lugar de aplicar una cobertura VPN general a toda la actividad del dispositivo. Agregar y Eliminar Aplicaciones del Túnel VPN

#### Agregar y Eliminar Aplicaciones del Túnel VPN con VpnSdk

Para personalizar aún más tu experiencia VPN y definir qué aplicaciones específicas deseas que se enrutadas a través del túnel VPN, puedes utilizar los métodos `addApp` y `removeApp` del SDK de VPN. Es importante recordar que el efecto de agregar o quitar aplicaciones depende del modo de túnel que hayas configurado previamente (`KILL_SWITCH`, `ONLY_ADDED_APPS`, o `ONLY_NOT_ADDED_APPS`).

**Agregar una Aplicación al Túnel VPN**

Para incluir una aplicación específica en el túnel VPN, de manera que su tráfico de Internet se encripte y redireccione a través de la VPN, utiliza el método `addApp` como se muestra a continuación:

{% tabs %}
{% tab title="Java" %}

```java
VpnSdk.INSTANCE.addApp("nombre.del.paquete.de.la.aplicación");
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
VpnSdk.addApp("nombre.del.paquete.de.la.aplicación");
```

{% endtab %}
{% endtabs %}

Reemplaza "**nombre.del.paquete.de.la.aplicación**" con el identificador único del paquete de la aplicación que deseas agregar.

**Eliminar una Aplicación del Túnel VPN**

Si deseas excluir una aplicación del túnel VPN, para que su tráfico de Internet no se enrute a través de la VPN, puedes utilizar el método `removeApp` de la siguiente manera:

{% tabs %}
{% tab title="Java" %}

```java
VpnSdk.INSTANCE.removeApp("nombre.del.paquete.de.la.aplicación");
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
VpnSdk.removeApp("nombre.del.paquete.de.la.aplicación");
```

{% endtab %}
{% endtabs %}

Nuevamente, reemplaza `"`**`nombre.del.paquete.de.la.aplicación`**`"` con el identificador único del paquete de la aplicación que deseas eliminar.

Recuerda que el efecto de agregar o eliminar aplicaciones del túnel VPN dependerá del modo de operación que hayas establecido utilizando el método `setTunnelingMode`. Por ejemplo, si eliges `ONLY_ADDED_APPS`, solo las aplicaciones agregadas explícitamente se beneficiarán del enrutamiento a través del túnel VPN.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.netsocks.io/spanish/productos/easy-vpn-sdk/integracion-del-sdk/instalacion-y-uso.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
