2016-12-09 7 views
0

Ich brauche Hilfe, um zu verstehen, wie man eine Verbindung zu einem TCP-Client auf Android mit einem Server herstellen, die Verbindung selbst ist nicht das Problem, sondern der Austausch zwischen den Aktivitäten.TCP/IP-Client empfängt und sendet zwischen verschiedenen Android-Aktivitäten

Ich werde versuchen, mit dem beigefügten Bild zu erklären.

Ich muss eine Verbindung zu einem Server über TCP/IP-Sockets starten. Nach einer Suche nach dem Netz fand ich mehrere Beispiele, aber alle eine einzige Tätigkeit, aber ich brauche es wie folgt zu arbeiten:

enter image description here

1 - Lassen Sie uns in der Haupttätigkeit sagen, dass ich die Verbindung starten, indem Sie auf VERBINDEN.

2 - Aber dann muss ich auf die Schaltfläche ACTIVITY_A klicken, um eine andere Aktivität zu öffnen, während die Verbindung beibehalten wird, die bereits in der Hauptaktivität geöffnet wurde, und weiterhin Informationen in ACTIVITY_A senden und empfangen.

3 - Zurück zu ACTIVITY_A, klicken Sie auf ACTIVITY_B und führen Sie den gleichen Vorgang oben aus.

Ich bin verloren zwischen welcher Lösung zu verwenden und wie asynctask, thread, singleton, intent, Kontext zu verwenden.

+0

* Aber dann muss ich (...) eine andere Aktivität öffnen, während ich die Verbindung behalte * Benutze Service und dann – Selvin

+0

Kannst du ein minimales reproduzierbares Stück Code hinzufügen, das zeigt, was du bisher hast? –

+0

Pro Tipps für Titel hier: (a) nicht hinzufügen [gelöst], verwenden Sie stattdessen das Akzeptanzsystem; (b) Schreiben Sie sie in normal fließendes Englisch, anstatt selbst gemachte Tags mit Bindestrichen, Strichen, Schrägstrichen und Doppelpunkten einzufügen. Ich habe die Frage auf dieser Grundlage bearbeitet. – halfer

Antwort

0

Sie können den Android Service für die Netzwerkverbindung verwenden. Sehen Sie sich auch Android Networking offizielle Dokumente an. Auch gibt es eine Bibliothek für die Durchführung von Netzwerk-Anfragen (wie Robospice)

0

Ich habe die vorherige Nachricht bearbeitet, um zu informieren, wie ich es gelöst habe, kann es nicht ideal sein, aber es funktioniert.

Act_Main

public class Act_Main extends AppCompatActivity implements Singleton.OnReceiveListener{ 

private Singleton sing; 
String ip = "192.168.4.1"; 
int porta = 23; 

Button btConectar, btActivityA, btActivityB; 
TextView txtStatus; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.act_main); 

    btConectar = (Button) findViewById(R.id.btConectarID); 
    btActivityA = (Button) findViewById(R.id.btActivityAID); 
    btActivityB = (Button) findViewById(R.id.btActivityBID); 
    txtStatus = (TextView) findViewById(R.id.txtStatusID); 

} 

public void conectar (View view){ 
    sing = Singleton.getInstance(ip, porta, this); 
} 

public void openActivityA(View view) { 
    Intent it = new Intent(Act_Main.this, Activity_A.class); 
    startActivity(it); 
} 

public void openActivityB(View view) { 
    Intent it = new Intent(Act_Main.this, Activity_B.class); 
    startActivity(it); 
} 

@Override 
public void onReceive(String dataRx) { 
    // Trata a informação recebida aqui. 
    txtStatus.setText(dataRx); 
} 
}  

Singleton

public class Singleton { 
private static Singleton instancia = null; 
private static OnReceiveListener orl = null; 
private boolean running; 
private static Client client; 

private Singleton() { 
} 

public boolean isRunning() { 
    return running; 
} 

public void setRunning(boolean running) { 
    this.running = running; 
} 

public static interface OnReceiveListener { 
    public void onReceive(String dataRx); 
} 

public static Singleton getInstance(String _ip, int _port, OnReceiveListener listener) { 
    if (instancia == null) { 
     client = new Client(_ip, _port); 
     client.execute(); 
     instancia = new Singleton(); 
    } 
    orl = listener; 
    return instancia; 
} 

public void sendMsg(String str) { 
    client.sendMessage(str); 
} 


private static class Client extends AsyncTask<Void, String, Void> { 

    String dstAddress; 
    int dstPort; 
    String response = ""; 
    BufferedReader in; 
    PrintWriter out; 
    String incomingMessage; 
    private boolean running; 

    Client(String addr, int port) { 
     dstAddress = addr; 
     dstPort = port; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     Socket socket = null; 
     try { 
      socket = new Socket(dstAddress, dstPort); 
      running = true; 
      // Cria um objeto PrintWriter para enviar mensagens ao servidor. 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      // Cria um objeto BufferedReader para receber mensagens do servidor. 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      Log.d(TAG, "In/Out created"); 

      while (running) { 
       incomingMessage = in.readLine(); 
       if (incomingMessage != null) { 
        publishProgress(incomingMessage); 
       }else{ 
        running = false; 
       } 
       incomingMessage = null; 
      } 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      if (out != null) { 
       out.close(); 
      } 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... params) { 
     orl.onReceive(params[0]); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
    } 

    private void sendMessage(String message) { 
     if (out != null && !out.checkError()) { 
      out.println(message); 
      out.flush(); 
      Log.d(TAG, "Sent Message: " + message); 
     } 
    } 

} 
} 

Activity_A

public class Activity_A extends AppCompatActivity implements Singleton.OnReceiveListener { 

private Singleton sing; 
String ip = "192.168.4.1"; 
int porta = 23; 

Button btVoltar, btEnviar; 
TextView txtRx, txtTx; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_a); 

    btEnviar = (Button) findViewById(R.id.btEnviarID); 
    btVoltar = (Button) findViewById(R.id.btVoltarID); 
    txtRx = (TextView) findViewById(R.id.txtRxID); 
    txtTx = (TextView) findViewById(R.id.txtTxID); 

    sing = Singleton.getInstance(ip, porta, this); 

} 

@Override 
public void onReceive(String dataRx) { 
    txtRx.setText(dataRx); 
} 

public void Enviar (View view){ 
    sing.sendMsg(txtTx.getText().toString()); 
} 

public void Voltar(View view) { 
    this.finish(); 
} 
} 

Activity_B

public class Activity_B extends AppCompatActivity implements Singleton.OnReceiveListener { 

private Singleton sing; 
String ip = "192.168.4.1"; 
int porta = 23; 

Button btVoltar, btEnviar; 
TextView txtRx, txtTx; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_b); 

    btEnviar = (Button) findViewById(R.id.btEnviarID); 
    btVoltar = (Button) findViewById(R.id.btVoltarID); 
    txtRx = (TextView) findViewById(R.id.txtRxID); 
    txtTx = (TextView) findViewById(R.id.txtTxID); 

    sing = Singleton.getInstance(ip, porta, this); 

} 

@Override 
public void onReceive(String dataRx) { 
    txtRx.setText(dataRx); 
} 

public void Enviar (View view){ 
    sing.sendMsg(txtTx.getText().toString()); 
} 

public void Voltar(View view) { 
    this.finish(); 
} 
} 

Offensichtlich ist es nicht fertig, aber es ist ein Anfang.

Vielen Dank an diejenigen, die geantwortet haben.

Verwandte Themen