在 Java 中调用服务器方法时程序冻结
Program freeze when calling Server method in Java
我在 Java
中有一个基本的 GUI
,其中有一个 JButton
,我提供了使用该按钮启动 Server
的功能。但是当我点击按钮时,程序冻结了。是因为while loop
吗?如果是这样,我该如何克服这个问题?
Server Code
void connect_clients()
{
try {
ServerSocket listener = new ServerSocket(7700);
try {
while (true) {
Socket socket = listener.accept();
try {
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
out.println(new Date().toString());
}
finally {
socket.close();
}
}
}
finally {
listener.close();
}
}
catch (IOException ex) {
Logger.getLogger(Test_Frame.class.getName()).log(Level.SEVERE, null, ex);
}
}
这里是ServerSocket.accept()的方法说明:
Listens for a connection to be made to this socket and accepts it. The
method blocks until a connection is made.
在有数据输入到套接字之前,您的程序将停止运行。如果是另一个问题,请检查您的日志。可能还有其他问题。
您的程序正在冻结,因为您阻塞了 UI 线程。您需要 post 在单独的线程上进行此操作:
public void postListen()
{
new Thread(new Runnable()
{
public void run()
{
connect_clients();
}
}).start();
}
改为调用该方法,它应该 运行 单独线程上的 connect_clients() 方法。新线程将阻塞,直到客户端连接。
我在 Java
中有一个基本的 GUI
,其中有一个 JButton
,我提供了使用该按钮启动 Server
的功能。但是当我点击按钮时,程序冻结了。是因为while loop
吗?如果是这样,我该如何克服这个问题?
Server Code
void connect_clients()
{
try {
ServerSocket listener = new ServerSocket(7700);
try {
while (true) {
Socket socket = listener.accept();
try {
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
out.println(new Date().toString());
}
finally {
socket.close();
}
}
}
finally {
listener.close();
}
}
catch (IOException ex) {
Logger.getLogger(Test_Frame.class.getName()).log(Level.SEVERE, null, ex);
}
}
这里是ServerSocket.accept()的方法说明:
Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.
在有数据输入到套接字之前,您的程序将停止运行。如果是另一个问题,请检查您的日志。可能还有其他问题。
您的程序正在冻结,因为您阻塞了 UI 线程。您需要 post 在单独的线程上进行此操作:
public void postListen()
{
new Thread(new Runnable()
{
public void run()
{
connect_clients();
}
}).start();
}
改为调用该方法,它应该 运行 单独线程上的 connect_clients() 方法。新线程将阻塞,直到客户端连接。