程序在ServerSocket.accept-Java上没有响应
我的程序只监听一次连接。。。如果没有客户机连接,程序就会卡在clientSocket=serverSocket.accept()上。我的意思是我甚至不能关上窗户来打断它。我无法单击框架中的任何按钮等 我在我的其他程序中也以同样的方式使用了这段代码,但它工作得很好(我可以单击文本字段和按钮,填充并在其中键入值,对于这段代码,它只是冻结在那里,直到客户端连接,甚至无法退出) 我已经删除了除此之外的所有代码(如下),但我仍然遇到相同的“冻结”问题程序在ServerSocket.accept-Java上没有响应,java,sockets,interrupt,freeze,Java,Sockets,Interrupt,Freeze,我的程序只监听一次连接。。。如果没有客户机连接,程序就会卡在clientSocket=serverSocket.accept()上。我的意思是我甚至不能关上窗户来打断它。我无法单击框架中的任何按钮等 我在我的其他程序中也以同样的方式使用了这段代码,但它工作得很好(我可以单击文本字段和按钮,填充并在其中键入值,对于这段代码,它只是冻结在那里,直到客户端连接,甚至无法退出) 我已经删除了除此之外的所有代码(如下),但我仍然遇到相同的“冻结”问题 setTitle(title); se
setTitle(title);
setSize(sizeW, sizeH);
setVisible(visibility);
setResizable(resizability);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addKeyListener(new MyKeyAdapter());
addMouseListener(new MyMouseAdapter());
//Container
c = getContentPane();
c.setLayout(new BorderLayout());
听起来您正在对GUI的事件调度线程(EDT)执行
serverSocket.accept()
调用。Swing依赖于EDT来呈现和处理用户交互-如果您执行诸如“accept”之类的阻塞调用,您将不会在GUI上看到任何更新
您需要做的是创建一个新线程(或者使用应用程序的“主”线程,这与EDT不同),该线程位于accept上,等待客户端连接。连接后,它可以执行任何需要的工作,但是当您想要更新GUI时,您需要将执行更新的代码包装在一个
Runnable
中,并通过SwingUtilities将其传递给EDT。invokeLater
在您的代码中,您在哪里调用“runServer”?谢谢,我明白您的意思了。我在另一个线程中运行了它,它可以正常工作。
setTitle(title);
setSize(sizeW, sizeH);
setVisible(visibility);
setResizable(resizability);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addKeyListener(new MyKeyAdapter());
addMouseListener(new MyMouseAdapter());
//Container
c = getContentPane();
c.setLayout(new BorderLayout());