【问题标题】:TCP/IP client receiving and sending between various Android activities各种 Android 活动之间的 TCP/IP 客户端接收和发送
【发布时间】:2017-04-24 19:47:22
【问题描述】:

我需要帮助来了解如何使用服务器与 Android 上的 tcp 客户端建立连接,连接本身不是问题,而是活动之间的交换。

我会试着用附图解释一下。

我需要使用 TCP/IP 套接字启动到服务器的连接。在网上搜索后,我找到了几个示例,但都使用一个活动,但我需要它按如下方式工作:

1 - 假设在主要活动中,我通过单击 CONNECT 开始连接。

2 - 但是我需要点击 ACTIVITY_A 按钮打开另一个 Activity,同时保持主 Activity 中已经打开的连接,并继续在其 ACTIVITY_A 中发送和接收信息。

3 - 返回 ACTIVITY_A,点击 ACTIVITY_B 执行上述相同的过程。

我在使用哪种解决方案以及如何使用、异步任务、线程、单例、意图、上下文之间迷失了方向。

【问题讨论】:

  • 但是我需要(...)在保持连接的同时打开另一个活动然后使用服务
  • 您能否添加一段可重现的最少代码来显示您目前拥有的内容?
  • 这里标题的专业提示:(a)不要添加[已解决],而是使用接受系统; (b) 用普通流畅的英文书写,而不是使用破折号、横杠、斜杠和冒号添加自制标签。我在此基础上编辑了问题。

标签: android android-activity tcp client


【解决方案1】:

您可以使用 Android 服务进行网络连接。也请看Android Networking官方文档。还有很多用于执行网络请求的库(如Robospice

【讨论】:

    【解决方案2】:

    我编辑了上一条消息以告知我如何解决它,它可能并不理想,但它正在工作。

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

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

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

    显然它还没有结束,但它是一个开始。

    感谢那些回复的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-17
      • 2018-09-19
      • 1970-01-01
      • 2016-09-03
      • 2013-10-02
      • 2011-09-13
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多