【问题标题】:Keeping a socket connection open while sending commands on Android在 Android 上发送命令时保持套接字连接打开
【发布时间】:2014-06-26 13:54:30
【问题描述】:

这周我开始了 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;
    }

}

提前感谢您的帮助!

【问题讨论】:

  • 我怀疑您想在 AsyncTask 之外打开 Socket 连接,并在创建时将其传递给 AsyncTask。这将允许它在您需要时出现,而不是关闭连接。
  • 我该怎么做? Android 不允许我在主 Activity 中创建连接。

标签: java android sockets android-asynctask


【解决方案1】:

您真正想要的是Service。服务有点复杂,可能比我真正想在这里输入的答案更复杂,但这里有几件事:

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

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

【讨论】:

  • 谢谢!我想我必须多学习一点。 Coursera 看起来是一个不错的起点!
猜你喜欢
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多