【问题标题】:create a server application having gui创建具有 gui 的服务器应用程序
【发布时间】:2012-01-15 16:47:58
【问题描述】:

我必须创建一个具有 GUI 的应用程序。我的应用程序必须作为服务器工作。当它启动时,它必须接受所有传入的连接并将输出写入 JTextArea。我的问题是我必须以我可以接受连接的方式创建ServerSocket ss = new ServerSocket(port_number) 和方法ss.accept。我试图在我的 gui 的主构造函数中创建,但是 ServerSocket anI/O 请求 gui 卡住。一些想法来解决解决方案?

我在我的 GUI 的构造函数中创建:

SwingUtilities.invokeLater(new Runnable(){public void run(){connection();}});

connection() 是我创建 serversocket 并接受调用的方法

【问题讨论】:

  • 您应该将服务器的功能与 gui 分开。 Gui 操作需要在称为 EventDispatchThread 的东西中运行,任何类似服务器的操作或其他工作都应该在单独的线程中完成
  • @Mazzy 与您上一个问题的建议相同,使用 SwingWokrer
  • 没错——你应该已经知道答案了!
  • @Mazzy:但是你应该已经知道解决这类问题是必要的,所以为什么要浪费你和我们的时间来问这个问题呢?相反,您应该专注于让 SwingWorkers 工作,如果失败,请在此处询问 SwingWorkers。
  • I don't have the idea how to use SwingWorker - 有关工作示例,请参阅Concurrency 上的教程。

标签: java swing sockets event-dispatch-thread concurrency


【解决方案1】:

您应该创建一个单独的线程来等待/处理网络连接。

当有新连接进入时,读取数据并将它们传递给 EDT 以更新 GUI。

这样,GUI 将响应。

您应该阅读有关MVC Pattern 线程的信息。如果你谷歌有大量的文章要研究

更新:

您的代码是错误的。

SwingUtilities.invokeLater(new Runnable(){public void run(){connection();}});

您正在处理来自 EDT 线程的连接。
您应该使用它来更新 GUI,而不是调用网络 I/O 代码。

【讨论】:

    【解决方案2】:

    IO 逻辑必须在(至少一个)单独的后台线程中。每次必须从这些后台线程之一将某些内容打印到文本区域时,他们应该使用SwingUtilities.invokeLater() 执行此操作,以确保仅从事件调度线程访问 Swing 组件。

    也就是说,我认为为服务器提供 GUI 并不是一个好主意。您为什么不简单地写入日志文件,然后使用任何文本编辑器查看服务器收到的内容。还是把服务端的GUI写成这个服务端的客户端?

    【讨论】:

    • +1 用于日志记录建议。我最近使用了一个 log4j appender,它能够在文本区域中输出日志消息。你想要类似的东西在这里。您的应用程序应该能够在没有 UI 的情况下运行,并且如果需要/想要,显示带有消息的 UI。虽然在控制台上一个简单的tail 会同样有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多