2016-12-09 9 views
0

私は、サーバー上でAndroid上でtcpクライアントに接続する方法を理解する助けが必要です。接続自体は問題ではなく、アクティビティ間の交換です。さまざまなAndroidの活動の間で送受信するTCP/IPクライアント

添付の画像で説明しようとします。

TCP/IPソケットを使用してサーバーへの接続を開始する必要があります。ネットを検索した後、私はいくつかの例を見つけましたが、すべてが単一のアクティビティを使用して、私は次のようにそれが動作する必要があります:

enter image description here

1は - 私はをクリックして接続を開始するのが主な活動にしましょうCONNECTで

2 - しかし、メインアクティビティですでに開いている接続を維持しながら別のアクティビティを開くには、ACTIVITY_Aボタンをクリックし、ACTIVITY_Aで情報の送受信を続ける必要があります。

3 - ACTIVITY_Aに戻ると、上の同じプロセスを実行してACTIVITY_Bをクリックします。

私は、使用するソリューションと使用方法、asynctask、スレッド、シングルトン、インテント、コンテキストの間で紛失しています。

+0

*しかし、接続を維持しながら別のアクティビティを開くには(...)が必要です。サービスを使用してください。 – Selvin

+0

これまでに持っていたことを示す最小限の再現性のあるコードを追加できますか? –

+0

タイトルのプロのヒント:(a)[解決済み]を追加しないでください。代わりに承認システムを使用してください。 (b)ダッシュ、バー、スラッシュ、コロンを使用して自家製のタグを追加するのではなく、通常の英語で書いてください。私はこれに基づいて質問を編集しました。 – halfer

答えて

0

Androidサービスを使用してネットワークに接続できます。また、Android Networking公式ドキュメントをご覧ください。また、ネットワークリクエストを実行するためのライブラリがたくさんあります(Robospiceなど)

0

私はそれをどのように解決したかを伝えるために以前のメッセージを編集しました。理想的ではないかもしれませんが、動作しています。

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); 
} 
}  

シングルトン

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(); 
} 
} 

明らかに終了していませんが、それは始まりです。

回答いただきありがとうございます。

関連する問題