繁体   English   中英

在Android上发送命令时保持套接字连接打开

[英]Keeping a socket connection open while sending commands on Android

本周,我开始进行Android编程,这就是我想要通过第一个应用程序实现的目标。 我是Java和Android的新手,但我有一些Python经验。

我在raspberryPi上运行了一个python服务器,根据收到的命令,该服务器会淡化一堆RGB led。

我现在正在尝试构建一个Android应用,该应用通过套接字将命令发送到服务器。

有一个输入框和一个按钮:当按下按钮时,我希望将输入的数据发送到服务器。

我编写了它,并且它起作用了,但是我相信我的实现存在问题。 我希望该应用程序打开套接字连接,并在保持打开状态的同时将命令发送到服务器。

单击后,按钮会将输入的命令和服务器地址传递给ASyncTask,然后ASyncTask打开与服务器的连接并发送命令。 但是,要发送新命令,必须关闭并再次打开连接,并且ASyncTask再次调用。

我不需要这个:连接应该一直保持打开状态。

这是我的代码(重要部分):

单击按钮后,它将获取输入并将其发送到ASyncTask:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final EditText inputText = (EditText) findViewById(R.id.editText2);
    final Button sendButton = (Button) findViewById(R.id.button);
    final TextView text = (TextView) findViewById(R.id.textView3);

    sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String outputText = inputText.getText().toString().concat("\n");
            text.append(outputText);
            ConnectTask task = new ConnectTask();
            task.execute("192.168.1.3:1322", inputText.getText().toString());

        }
    });

这是我的ASyncTask子类:

private class ConnectTask extends AsyncTask<String, Void, Void>{
    @Override
    protected Void doInBackground(String... strings){
        String[] spl = strings[0].split(":");
        String address = spl[0];
        int port = Integer.parseInt(spl[1]);
        SocketAddress sockaddr = new InetSocketAddress(address, port);
        Socket socket = new Socket();
        try{
            socket.connect(sockaddr, 5000);
        } catch (IOException e){
            e.printStackTrace();
        }
        OutputStream os = null;
        try {
            os = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);
        try {
            bw.write(strings[1]);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

在此先感谢您的帮助!

您真正想要的就是服务 服务有点复杂,而且答案可能比我在此输入的要复杂得多,但是这里有几件事:

  1. 您需要绑定服务,因此可以将消息从您的应用发送到该服务,然后再发送回去。
  2. 您可能会看到Coursera课程https://class.coursera.org/posa-002/ ,该课程目前涵盖与您想要的内容类似的内容。
  3. 阅读我上面链接的文档。 服务需要仔细考虑,但是文档是好的。

服务之所以好,是因为它们在后台运行,可以在自己的线程上并与活动和其他服务进行交互。 您可以在connect上打开连接,通过在活动和服务之间来回发送消息在后台进行交谈,并在完成后断开服务。 尽管确实涉及一些相当复杂的连接,但所有操作都相对简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM