似乎当我使用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;
}
}
对我的代码的批评将非常感激:)
答案 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:当您使用线程时,管道具有更好的性能。
现在,如果你真的需要套接字,这里有一些示例代码可能有助于说明整个客户端服务器套接字组织的一般概念:
答案 2 :(得分:0)
当我使用Socket类的accept方法时 整个程序冻结,直到数据通过。