Conectarse a socket.io de NodeJS con Android

logo android

Lo primero es agregar la dependencia de la librería a nuestro archivo grade en nuestro proyecto en Android Studio.
compile 'com.github.nkzawa:socket.io-client:0.4.0'

Así en la actividad que queramos utilizar el socket creamos el objeto Socket.
Socket socket;

y algunas constantes que utilizaremos en nuestro código.

final static String URL_SOCKET = "http://localhost";
final static String MY_EVENT = "my event";
final static String PARAM_NAME = "name";
final static String PARAM_IMAGE = "image";

Instanciamos nuestra conexión al servidor pasando como parámetro la url de este mismo.

try{
  /* Instance object socket */
  socket = IO.socket(URL_SOCKET);
}catch (URISyntaxException e){
  e.printStackTrace();
}

Podemos instanciar el objecto con opciones predeterminadas para que se reconecte el socket.

IO.Options opts = new IO.Options();
opts.forceNew = true;
opts.reconnection = false;
try{
  /* Instance object socket */
  socket = IO.socket(URL_SOCKET, opts);
}catch (URISyntaxException e){
  e.printStackTrace();
}

O para utilizar conexiones SSL por defecto o como parámetro al instanciar el objeto

/* Default SSLContext for all sockets */
IO.setDefaultSSLContext(mySSLContext);

/* Set as an option */
opts = new IO.Options();
opts.sslContext = mySSLContext;
try{
  /* Instance object socket */
  socket = IO.socket(URL_SOCKET, opts);
}catch (URISyntaxException e){
  e.printStackTrace();
}

Luego creamos los eventos principales de nuestro socket: EVENT_CONNECT y EVENT_DISCONNECT, estos son los que recibirán las emisiones desde el servidor.

socket.on(Socket.EVENT_CONNECT, new Emitter.Listener(){
  @Override
  public void call(Object... args) {
    /* Our code */
  }
}).on(Socket.EVENT_DISCONNECT, new Emitter.Listener(){
  @Override
  public void call(Object... args) {
    /* Our code */      
  }
});

Y crear nuestros propios eventos listener

socket.on(MY_EVENT, new Emitter.Listener(){
  @Override
  public void call(Object... args) {
    /* Our code */      
  }
});

Con esto ya podemos abrir la conexión
socket.connect();

Además disponemos de otras funciones como para verificar el estado de la conexión.
socket.connected()

Para desconectar nuestro socket.
socket.disconnect()

Si lo que queremos es emitir eventos por nuestro socket utilizamos, enviando cadenas de texto o también datos binarios.

JSONObject obj = new JSONObject();
obj.put(PARAM_NAME, "Pablo");
obj.put(PARAM_IMAGE, new byte[42]);

/* Emit event */
socket.emit(MY_EVENT, obj)

También podemos capturar el callback que retorna el servidor

socket.emit(MY_EVENT, obj, new Ack() {
  @Override
  public void call(Object... args) {
    /* Our code */
  }
});

Y eso es todo, Saludos!

2 comentarios en “Conectarse a socket.io de NodeJS con Android

  1. caros

    hola, estoy usando este codigo y todo funciona hasta que intento hacer algo asi.

    socket.on(MY_EVENT, new Emitter.Listener(){
    @Override
    public void call(Object... args) {
    Toast.makeText(CONTEXTO, "Nueva entrada...", Toast.LENGTH_SHORT).show();
    }
    });

    entonces se detiene la aplicacion y con cualquier cosa que quiera ejecutar desde aqui, que tenga que ver con interfaz detiene la aplicacion.

    Responder
    1. Pablo Araya Autor de la entrada

      Hola! Tienes que agregarlo a Thread de la UI. Saludos!

      socket.on(MY_EVENT, new Emitter.Listener(){
      @Override
      public void call(Object… args) {
      runOnUiThread(new Runnable() {
      @Override
      public void run() {
      Toast.makeText(CONTEXTO, “Nueva entrada…”, Toast.LENGTH_SHORT).show();
      }
      });
      }
      });

      Responder

Agregar un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *