2014-06-12 6 views
5

Ho bisogno di inviare dati da un'app java a un'app per Android in tempo reale. I dati non sono grandi (numeri interi compresi tra 0 e 9) ma il numero di trasmissioni è alto, circa 5 trasmissioni al secondo.Invia dati in tempo reale da Java all'applicazione Android

Desidero avere un modello di sottoscrizione editore. L'app Java sta per inviare dati all'app per Android anziché all'app Android che esegue continuamente il ping dell'app java per i dati.

La trasmissione deve essere in tempo reale e avverrà su una LAN.

Provato con GCM ma non è in tempo reale. Pubnub è un altro, ma non è sicuro di come sarà in tempo reale.

Come procedere?

+0

sentito parlare di jms? –

+0

JMS potrebbe non essere supportato in Android. Guardando ActiveMQ, qualche idea? – Soumya

+0

C'è un motivo specifico per cui vuoi spingere? E "RealTime" è un po 'ampio. Quali sono i requisiti esatti in tempo reale? Hai mai pensato alle normali vecchie prese? – Fildor

risposta

3

PubNub è reale -time as a gets ... and è super facile far parlare un server Java con un dispositivo Android (infatti, PubNub ha SDK client per oltre 50 piattaforme diverse!).

Questo stesso codice verrà eseguito sia su Java Android e pianura:

import com.pubnub.api.*; 
import org.json.*; 

Pubnub pubnub = new Pubnub("demo", "demo"); 

Callback callback = new Callback() { 
    public void successCallback(String channel, Object response) { 
     Log.d("PUBNUB",response.toString()); 
    } 
    public void errorCallback(String channel, PubnubError error) { 
     Log.d("PUBNUB",error.toString()); 
    } 
}; 

try { 
    pubnub.subscribe("demo", callback); 
    } catch (PubnubException e) { 
    Log.d("PUBNUB",e.toString()); 
} 

pubnub.publish("demo", "Hello World !!" , callback); 

La guida completa è disponibile qui:

http://www.pubnub.com/docs/java/javase/tutorial/data-push.html

Se hai altre domande su di esso, non esitate a contatta [email protected] e sarà felice di aiutarti ulteriormente.

geremy

0

Se si stanno trasmettendo dati da Java ad app Android in LAN, è possibile utilizzare TCp/UDP per il trasferimento di dati in tempo reale tra l'app java e Android. In uno dei miei progetti mi trovavo nella stessa situazione ma voglio trasferire la stringa dall'app per Android all'applicazione java nel pc. In LAN uso TCP. l'app java stava ascoltando la connessione TCP e quando l'app Android inviava la richiesta all'app java per la connessione, allora anche i dati venivano trasferiti.

è possibile utilizzare questo scenario per il vostro problema

+0

Yeap, i socket hanno funzionato, ma in realtà non si ottiene il modello di sottoscrittore del publisher. – Soumya

1

Vorrei suggerire di utilizzare questo approccio:

  1. fare uno script server che serve l'applicazione, è possibile utilizzare PHP. Questo è il metodo preferito, ma puoi restare con il server java.
  2. Rendi il tuo server in ascolto su una porta specificata (se hai scelto java) o avvia il server web se usi la versione HTTP.
  3. L'app è chi deve avviare la comunicazione, non viceversa.

Se si desidera utilizzare il server HTTP, è necessario conoscere JSON o qualsiasi tecnica AJAX.

Se si bastone con il server Java si può decidere di implementare qualcosa di simile:

  1. vostri server attende una connessione, per esempio sulla porta 9999.
  2. L'applicazione invia un pacchetto di sincronizzazione tramite ObjectOutputStream per consentire al server di sapere che un cliente desidera informazioni.
  3. Il server invia le informazioni attraverso lo stesso socket.
  4. Il client lo ripete tutte le volte che è necessario.

Un cliente potrebbe assomigliare a questo:

public class Client { 
    public void retrieveData() { 
     ResponseObject response = null; 
     try { 
      Socket socket = new Socket("host", 9999); 
      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
      oos.writeObject(criterio); 
      oos.close(); 
      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
      Response response = (Response) ois.readObject(); 
      socket.close(); 
     } catch (IOException e) { 
      System.out.println("Error: "+e.getMessage()); 
     } 
     System.out.println("Response was: "response.toString()); 
    } 
} 

e un server in questo modo:

public class Server { 
    public void startServer() { 
     ServerSocket serverSocket = new ServerSocket(9999); 
     ExecutorService service = Executors.newFixedThreadPool(MAX_THREADS); 

     while (true) { 
      try { 
       servicio.submit(new Receiver(serverSocket.accept())); 
      } catch (IOException e) { 
       System.out.println("Error: "+e.getMessage()); 
      } 
     } 

     serverSocket.close(); 
    } 

    public class Receiver implements Callable<Object> { 
     Socket socket; 

     Receiver(Socket socket) { 
      this.socket = socket; 
     } 

     public Object call() { 
      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
      Object clientData = ois.readObject(); 
      ois.close(); 

      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
      oos.writeObject(...); /* Your response goes here */ 
      oos.close(); 

      socket.close(); 
      return null; 
     } 
    } 
} 
+0

Se non sbaglio, il cliente deve chiedere dati al server !! Voglio che il server spinga i dati al client. – Soumya

+0

Ecco perché è necessario inviare un segnale di 'sincronizzazione 'per far sapere al server che un client vuole dati, aprire una connessione e inviare dati al client attraverso quella connessione. Un server dovrebbe ** mai ** aprire una connessione a un client. Ma se insisti, dovresti usare la classe 'Server' sul client e la classe' Client' sul server e lasciare una porta aperta sul client. – arielnmz