java - 如何使用套接字进行线程以便程序不会停止

标签 java multithreading sockets

似乎当我使用 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();
    }
}

NetworkIO 类代码

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;
}
}

对我的代码的任何批评将不胜感激:)

最佳答案

通常的模式是在线程内运行接受循环,并有一个单独的处理程序线程池,您可以将请求分派(dispatch)到其中。

当你从accept得到一个新的socket时,将这个socket交给一个工作线程来处理。这样您就不需要将任何内容传递回主线程。

示例直接来自 ExecutorService javadocs:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

关于java - 如何使用套接字进行线程以便程序不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6784629/

相关文章:

java - 如何使用DriverManager模块化后打开jar内的HSQLDB资源(只读)?

java - 在java中跨多个进程更新单个对象

java - 你如何分派(dispatch)回 Java 中的主线程?

java - 如何从绘图线程(SurfaceView)调用另一个 Activity

c - 最佳本地套接字命名实践

c - Socket编程C【发送消息给选定的客户端】

java - 为什么我的异常处理错误会导致无限循环?

java - 当并非所有属性都在同一个类中时填充 JavaFX TableView

c++ - 非递归互斥所有权

ios - 在 Swift 3 中创建套接字