Java 同时从套接字读写

Java 同时从套接字读写,java,android,multithreading,sockets,Java,Android,Multithreading,Sockets,我正在用java编写一个android应用程序,我想创建一个侦听器,在while(true)循环中接收消息,并且能够向服务器发送消息。 对于此任务,我将套接字与asyncTask一起使用。 我已经编写了一个connectionHandler类来处理我的应用程序的所有发送和接收请求 到目前为止,一切都很顺利,每次只发送和接收一条消息,但我就是找不到同时发送和接收消息的方法 我需要在线程中执行以下代码,但我不知道如何执行,因为我必须返回一个字符串: public static String rece

我正在用java编写一个android应用程序,我想创建一个侦听器,在
while(true)
循环中接收消息,并且能够向服务器发送消息。 对于此任务,我将套接字与
asyncTask
一起使用。 我已经编写了一个
connectionHandler
类来处理我的应用程序的所有发送和接收请求

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

我需要在线程中执行以下代码,但我不知道如何执行,因为我必须返回一个
字符串

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;
    }
}
公共静态字符串接收(){
试一试{
返回mConnectionHandler.new AsyncReceiveFromServer().execute()
.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
返回null;
}
私有类AsyncReceiveFromServer扩展了AsyncTask{
@凌驾
受保护字符串doInBackground(无效…参数){
字符串结果=null;
试一试{
结果=in.readLine();
}捕获(IOE异常){
e、 printStackTrace();
}
返回结果;
}
}
当我在
while(true)
循环中运行receive函数时,我无法发送消息,因为
…execute().get()
正在阻止java类
connectionHandler

总之,如何以线程或任何其他异步方式执行上述代码?
或者您有任何其他建议,当接收是
while(true)
循环时同时运行发送和接收?

首先-不要使用execute.get()。如果您认为您需要使用它,那么您的架构是错误的——它打破了使用线程让调用线程等待结果的整个要点。如果您只调用execute,您将在另一个线程上运行,并且工作正常。如果需要多个线程同时运行,请使用executeOnExecutor()覆盖AsyncTask的4.0共享线程池机制


或者更好——不要为此使用AsyncTask。您想要永远运行一些东西,等待来自远程连接的输入。这比异步任务更适合线程。我会使用一个线程,并在线程中内置while循环,并且只有在连接关闭时线程才会终止。

首先-不要使用execute.get()。如果您认为您需要使用它,那么您的架构是错误的——它打破了使用线程让调用线程等待结果的整个要点。如果您只调用execute,您将在另一个线程上运行,并且工作正常。如果需要多个线程同时运行,请使用executeOnExecutor()覆盖AsyncTask的4.0共享线程池机制


或者更好——不要为此使用AsyncTask。您想要永远运行一些东西,等待来自远程连接的输入。这比异步任务更适合线程。我会使用一个线程,并在线程中内置while循环,只有在连接关闭时线程才会终止。

可能重复的可能重复的可能重复的感谢您的评论,我会考虑您所说的。谢谢您的评论,我会考虑您所说的。