繁体   English   中英

同时从套接字读取和写入

[英]Read and write from a socket simultaneously

我正在用Java编写一个android应用,我想创建一个监听器,它可以在while(true)循环中接收消息,并且还能够将消息发送到服务器。 对于此任务,我使用带有asyncTask套接字。 我编写了一个connectionHandler类,该类处理我的应用程序的所有发送和接收请求。

到目前为止,一切都很顺利,一次只能发送和接收一条消息,但我只是找不到一种同时完成消息的方法。

我需要在线程中执行以下代码,但是我不知道该怎么做,因为我必须返回String

public static String receive() {
    try {
        return mConnectionHandler.new AsyncReceiveFromServer().execute()
                .get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return null;
}

private class AsyncReceiveFromServer extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        String result = null;
        try {
            result = in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

当我在while(true)循环中运行receive函数while(true) ,我无法发送消息,因为...execute().get()阻塞了Java类connectionHandler

因此,总而言之,我如何以线程或任何其他异步方式执行以上代码? 或者,也许您还有其他建议在接收是while(true)循环的同时运行发送和接收?

首先,永远不要使用execute.get()。 如果您认为需要使用它,那么您就构造错了-它破坏了使用线程让调用线程等待结果的全部目的。 如果仅调用execute,则将在另一个线程上运行并正常工作。 如果需要多个同时真正运行的线程,请使用executeOnExecutor()重写AsyncTask的4.0共享线程池机制。

或更妙的是-不要为此使用AsyncTask。 您想永久运行某些东西,等待来自远程连接的输入。 这比AsyncTask更适合Thread。 我会选择一个线程,并在该线程中构建while循环,并让该线程仅在连接关闭时终止。

暂无
暂无

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

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