当前位置: 首页 > 面试题库 >

使用用户界面(Swing)在Java上启动ServerSocket冻结

裴鸿熙
2023-03-14
问题内容

美好的一天,

我有一个ServerSocket的无限循环,工作正常…问题是当我尝试使用按钮启动ServerSocket时。我的用户界面“冻结”什么都没有动,但服务器正常运行,这里有一个
ScreenShot

http://i.gyazo.com/15d331166dd3f651fc7bda4e3670be4d.png

当我按下按钮“ Iniciar”表示启动服务器时,用户界面冻结(ServerSocket无限循环)。 我无法更改我的代码,因为它可以正常工作。

    public static void iniciarServer() {

    try {
        appendString("\nServidor iniciado.");
        System.out.println("asdasd");
    } catch (BadLocationException e1) {
        e1.printStackTrace();
    }

    try {
        ss = new ServerSocket(1234, 3);
        while (true) {
            System.out.println("Esperando conexiones...");
            appendString("\nEsperando conexiones...");
            Socket s = ss.accept();
            System.out.println("Conexión entrante: " + s.getRemoteSocketAddress());
            appendString("\nConexión entrante: " + s.getRemoteSocketAddress());

            conexiones++;
            //System.out.println("Debug: conexiones SERVER: " + conexiones);
            MultiThread mt = new MultiThread(s, conexiones);
            mt.start();
            ///////////////////////////////////////////////////////////////
        }
    } catch (IOException e) {
        System.out.println("Error Server: " + e.getMessage());
    } catch (BadLocationException e) {
        e.printStackTrace();
    } 
    stopServer();
}

appendString(); 用于向JTextPane添加一些文本,但由于UI冻结而无法正常工作。

有什么方法可以做一个不会因无限循环而冻结的用户界面?

谢谢!


问题答案:

Swing是一个单线程框架,这意味着在事件调度线程的上下文中执行的任何阻塞或长时间运行的操作都将阻止它处理事件队列,从而使应用程序挂起。

它也不是线程安全的,因此您永远不要尝试从EDT外部修改任何UI组件的状态。

查看Swing和Worker线程中的并发性以及SwingWorker中的更多细节

public class ServerSocketWorker extends SwingWorker<Void, String> {

    private JTextArea ta;

    public ServerSocketWorker(JTextArea ta) {
        this.ta = ta;
    }

    @Override
    protected void process(List<String> chunks) {
        for (String text : chunks) {
            ta.append(text);
        }
    }

    @Override
    protected Void doInBackground() throws Exception {
        ss = new ServerSocket(1234, 3);
        while (true) {
            publish("\nEsperando conexiones...");
            Socket s = ss.accept();
            publish("\nConexión entrante: " + s.getRemoteSocketAddress());

            conexiones++;
            //System.out.println("Debug: conexiones SERVER: " + conexiones);
            MultiThread mt = new MultiThread(s, conexiones);
            mt.start();
            ///////////////////////////////////////////////////////////////
        }
    }

    @Override
    protected void done() {
        stopServer(); //??
    }
}

要启动它,您可以使用类似…

public void iniciarServer() {
    ServerSocketWorker worker = new ServerSocketWorker(textAreaToAppendTo);
    worker.execute();
}

举个例子



 类似资料:
  • 我知道这是一个简单的问题,但没有比堆栈溢出更好的问题了。我一直在开发一个Java桌面应用程序,它连接到远程数据库,并使用大量JTables和jasper报表。我已经到了必须开始考虑用户界面的时候,我注意到我可以使用JavaFX来实现用户界面。根据我一直在做的一些研究,JavaFX似乎提供了比Swing更好的用户界面。我的问题是,JavaFX适合我的应用程序吗?当我的应用程序使用大量数据库查询、表和

  • 作为一名Java Swing新手,我在将用户界面逻辑与域逻辑分离时遇到了一些困难。 我有一个小的(琐碎的?)带有JFrame的Swing应用程序,其中包含JLabel、JTextField和JButton。按下JButton时,会弹出JFileChooser对话框。选择文件后,JTextField包含文件的绝对路径。到目前为止还没有什么引人注目的。我想完成的下一件事是将文件的绝对路径“注入”到一个

  • 问题内容: 在我的应用程序中,我正在使用Intentservice从服务器获取数据,并将获取的数据存储到本地sqlite db中。我正在使用5 IntentService来获取并填充五个表。每个意向服务的数据最多可包含300行。我该怎么办? IntentService代码: 调用intentservice的代码: 并在完成任务时向我发送代码 在onReceiveResult ..中,结果代码通过调

  • 问题内容: 我知道我知道,到处已经有上百万个问题和答案。关于它的大量真正详尽的文章,几种示例。我已经花了几个小时阅读有关它的信息,但这并不能解决问题。我之所以这样问,是因为我仍然不安静地理解我需要做的事情,显然是因为我的代码仍然无法正常工作。我想到了Swing如何与EDT一起工作,并且如果要使用ServerSocket的accept()方法,我将需要为Swing启动一个新线程(我认为?)。当我按原

  • 主要内容:将Mat转换成缓冲的图像,使用AWT/Swings显示图像在前面的章节中,我们讨论了如何使用OpenCV Java库来读取和保存图像。 除此之外,我们还可以使用GUI库(如AWT/Swings和JavaFX)在单独的窗口中显示加载的图像。 将Mat转换成缓冲的图像 要读取图像,使用方法。 此方法返回以的形式读取的图像。 但是,要将此图像与GUI库(AWT/Swings和JavaFX)结合使用,应将其转换为包的类的对象。 以下是将OpenCV的对象转换为对

  • 用户界面 UI UI 系统允许你快速地、直观地创建用户界面。本节介绍 Unity UI 系统的主要功能。 相关教程:用户界面(UI) 有关提示、技巧和错误排查,请搜索 Unity 知识库。