Java 如何使用套接字线程,使程序不会';停不下来
似乎当我使用Socket类中的accept方法时,整个程序都会冻结,直到数据通过。我已经将套接字传递给了一个线程,它并没有冻结,但我需要线程返回数据,我认为它做不到这一点 获取用户名称的代码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
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方法时 整个程序冻结,直到数据通过
可能有帮助:我以前得到过答案,没有代码,但谢谢你的提示。现在我将添加一些。考虑使用非阻塞I/O(从<代码>套接字。GETCHANNEL()/代码>并从那里开始)。“显示你的代码!显示你的代码”没错,他说的是在线程之间处理数据?不清楚他到底想做什么。@Baba:看我修改过的答案。