如何与套接字进行线程,以便程序不会停止

时间:2011-07-22 01:02:22

标签: 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;
}
}

对我的代码的批评将非常感激:)

3 个答案:

答案 0 :(得分:3)

通常的模式是在线程内运行accept循环,并有一个单独的处理程序线程池,您可以将请求分派给。

当您从accept获取新套接字时,将套接字交给工作线程进行处理。这样你就不需要将任何东西传回主线程。

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

答案 1 :(得分:1)

有趣的是你使用套接字和线程。您是否有理由不使用管道? Performance of sockets vs pipes:当您使用线程时,管道具有更好的性能。

现在,如果你真的需要套接字,这里有一些示例代码可能有助于说明整个客户端服务器套接字组织的一般概念:

http://zerioh.tripod.com/ressources/sockets.html

答案 2 :(得分:0)

  

当我使用Socket类的accept方法时   整个程序冻结,直到数据通过。

  1. Socket类中没有accept()方法。
  2. ServerSocket类中有一个。
  3. 阻止直到连接出现。
  4. 它返回一个Socket。
  5. 读取Socket块直到数据通过。