java - 网络线程和 Swing 线程出现问题

标签 java multithreading forms swing sockets

我有一个使用 Socket TCP/IP 和 GUI 的 java 应用程序。服务器始终监听连接并接收来自客户端的消息。当服务器收到消息时,会显示一个 Swing 表单。 我的问题是,当我单击关闭按钮时,应用程序将停止,尽管我设置服务器套接字始终监听连接(通过循环中的 put 方法 serverSocket.accept() while(true))。 我该如何解决这个问题?

这是我在服务器上的代码: 公共(public)类 TCPServer {

ServerSocket server = null;
BufferedReader in;
PrintWriter out;
Socket client = null;

//open serverSocket
public void openServer() {
    try {
        server = new ServerSocket(1234);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

//accept connection and read data
public void listening() {
    try {

        while (true) {
            client = server.accept();
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintWriter(client.getOutputStream(), true);
            //read data from stream
            String s = in.readLine();
            System.out.println("String receive:  " + s);

            new NewJFrame().setVisible(true);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void closeServer() {
    try {
        if (out != null) {
            out.close();
        }

        if (in != null) {
            in.close();
        }
        if (client != null) {
            client.close();
        }
        if (server != null) {
            server.close();
        }
    } catch (Exception e) {
    }
}

public static void main(String arg[]) {
    TCPServer server = new TCPServer();
    server.openServer();
    server.listening();
    server.closeServer();
}

}

最佳答案

来自Javadoc :

      EXIT_ON_CLOSE 
      The exit application default window close operation.

NewJFrame 类中,删除以下内容:setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

这将使整个应用程序在按下关闭按钮时关闭!

将其替换为: setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

这样您就可以确定只处理窗口,而不是整个应用程序

关于java - 网络线程和 Swing 线程出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9744111/

相关文章:

java - java中如何支持jedis集群

ruby - map 在这种情况下如何工作?

python - 如何停止 wxpython 中的线程?

linux - 非抢占式线程?

java - maven-antrun-plugin 跳过执行

java - SwingWorker 和 SwingUtilities.invokeLater 的区别

java - 删除后台 Activity 堆栈

mysql - Django - MySQL 数据库日期时间字段被清除

PHP - 登录后如何获取正确的名字和姓氏?

javascript - 限制 td 之间的空间