Java 如何使用套接字线程,使程序不会';停不下来

Java 如何使用套接字线程,使程序不会';停不下来,java,multithreading,sockets,Java,Multithreading,Sockets,似乎当我使用Socket类中的accept方法时,整个程序都会冻结,直到数据通过。我已经将套接字传递给了一个线程,它并没有冻结,但我需要线程返回数据,我认为它做不到这一点 获取用户名称的代码 public boolean checkUsername() { NetworkIO n = new NetworkIO(); // Grabs username from edittext field username = usernameEditText.getText().to

似乎当我使用Socket类中的accept方法时,整个程序都会冻结,直到数据通过。我已经将套接字传递给了一个线程,它并没有冻结,但我需要线程返回数据,我认为它做不到这一点

获取用户名称的代码

public boolean checkUsername() {
    NetworkIO n = new NetworkIO();
    // Grabs username from edittext field
    username = usernameEditText.getText().toString();
    System.out.println(usernameEditText.getText().toString());
    // queries databse for username
    try {
        resultFromServer = n.query("username",
                "select username FROM user_info  WHERE MATCH (username)  AGAINST ('"
                        + username + "' IN NATURAL LANGUAGE MODE);");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
网络IO类代码

public class NetworkIO extends Activity {
    Socket networkSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;


public String query(String request, String fieldRequested)
        throws IOException {

    // Tries to get connection
    try {

        networkSocket = new Socket("192.168.1.8", 9009);

        out = new PrintWriter(networkSocket.getOutputStream(), true);

        in = new BufferedReader(new InputStreamReader(
                networkSocket.getInputStream()));
        System.out.println("Hi from in made");
    } catch (UnknownHostException e) {
        System.err.println("Unknown host");
        System.exit(-1);

    } catch (IOException e) {
        System.err.println("IOException");
        System.exit(-1);
    }


    //Sends Request
    out.println(request);
    out.println(fieldRequested);
    String resultFromServer = "";

    //Waits for response and if its null exit
    while ((in.readLine()) != null) {
        resultFromServer += in.readLine();

    }
    System.out.println(resultFromServer);

    //Close the connections
    out.close();
    in.close();
    networkSocket.close();


    return resultFromServer;
}
}

如果您对我的代码有任何批评,我们将不胜感激:)

您使用的是套接字和线程,这很有趣。您不使用管道的原因是什么当您仅使用线程时,管道具有更好的性能

现在,如果您确实需要套接字,下面是一些示例代码,可能有助于说明整个客户机-服务器套接字组织的总体思路:


通常的模式是在线程内运行accept循环,并有一个单独的处理程序线程池,用于向其发送请求

当您从accept获得一个新套接字时,将该套接字交给工作线程处理。这样,您就不需要将任何内容传递回主线程

示例直接来自ExecutorService javadocs:

似乎当我使用套接字类中的accept方法时 整个程序冻结,直到数据通过

  • 套接字类中没有accept()方法
  • ServerSocket类中有一个
  • 它会一直阻塞,直到连接通过
  • 它返回一个套接字
  • 读取套接字块,直到数据通过

  • 可能有帮助:我以前得到过答案,没有代码,但谢谢你的提示。现在我将添加一些。考虑使用非阻塞I/O(从<代码>套接字。GETCHANNEL()/代码>并从那里开始)。“显示你的代码!显示你的代码”没错,他说的是在线程之间处理数据?不清楚他到底想做什么。@Baba:看我修改过的答案。