【问题标题】:Listening for connections in a separate thread在单独的线程中侦听连接
【发布时间】:2011-08-03 08:44:55
【问题描述】:

这是 java 中的一个 messenger 项目的一部分。因为客户端使用直接连接进行聊天,所以我希望每个客户端都侦听某个端口,而其他客户端则为该地址创建一个套接字。但是当我在另一个线程中调用 ServerSocket.accept() 时,似乎所有线程都已暂停。这意味着执行该命令后什么都没有发生。这是创建新线程的代码。

java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        while(true){
                            System.out.println("flag1");
                            Socket socket = listeningSocket.accept();
                            System.out.println("flag2");
                            new Chat(socket).setVisible(true);;
                            jTextArea1.append("successfully connected\n");
                        }
                    } catch (NullPointerException e) {
                        System.out.println("i know");
                    }
                    catch (IOException e) {
                        e.printStackTrace();
                        jTextArea1.append("error in recieving connection\n");
                    }
                }
            });

任何想法如何解决这个问题?

【问题讨论】:

  • 大部分时间应该被阻塞,总线有时应该响应别人
  • @kvphxga,mre 指的是您在 Stack Overflow 上提出了 8 个问题,但只接受了其中一个问题的答案。这被认为是粗鲁的,除非你真的觉得没有人充分回答你的任何问题。

标签: java sockets network-programming


【解决方案1】:

当我在另一个线程中调用 ServerSocket.accept() 时,似乎 所有线程都已挂起

怎么看? accept() 只阻塞当前线程。你是在 AWT 线程中调用它吗?例如一个 actionPerformed() 方法?不要在这些方法中进行任何网络操作,使用单独的线程。

【讨论】:

  • 程序的 GUI 没有正确加载。顺便说一句……这段代码在构造函数中。
  • 这段代码在 JFrame 的构造函数中。它在 AWT 线程中吗?
【解决方案2】:

Socket.accept() 确实阻塞了当前线程。只有在收到连接后,您才会看到“flag2”打印出来。但它只阻塞当前线程。

我怀疑您没有正确运行单独的线程(您调用的是 yourThreadHere.start(),而不是 .run(),对吧?)。

【讨论】:

  • EJP 是对的,您正在 AWT/Swing 线程中执行该代码,这将冻结您的所有程序界面。了解 AWT/Swing 线程模型。
  • 嗯...那是什么线程?此代码位于 JFrame 对象的构造函数中。是否在 AWT/SWing 线程中?
  • 是的,java.awt.EventQueue.invokeLater 不会启动另一个线程,它会在主界面线程中执行给定的runnable。
猜你喜欢
  • 2011-02-01
  • 2014-05-02
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多