【问题标题】:Listen to two ports simultaneously in java在java中同时监听两个端口
【发布时间】:2014-10-31 14:46:43
【问题描述】:

我正在使用 java 开发一个聊天应用程序。我想要实现的功能之一是除了客户端 1 与客户端 2 聊天(工作正常)之外,客户端 1 将向客户端 2 发送辅助信息(来自 Arduino 的数据)。我的想法是监听服务器上的两个端口,一个用于聊天,另一个用于辅助信息,我使用了两个 ServerSocket,当然还有两个 accept() 语句,它们一直处于阻塞状态。我的问题是如何在 java 中同时打开两个端口? 我从这样的事情开始:

new Thread() {
            public void run() {

                while(true) {
                    try {
                        Socket client1 = server.accept();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    //handle client1
                }
            }}.start();
            new Thread() {
                public void run() {

                    while(true) {
                        try {
                            Socket client2 =arduinoServer.accept();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        //handle client1
                    }
                }}.start();

但我在线程“pool-1-thread-1”java.lang.NullPointerException 中遇到异常

谢谢。

【问题讨论】:

  • 带有Selector 的解决方案可能是最好的。

标签: java sockets serversocket ports


【解决方案1】:

当然,他们一直在阻止。 accept() 是一个阻塞方法。

你需要两个 accept() 循环,在两个线程中。

【讨论】:

  • 没想到使用线程,我现在要试试这个,你能解释一下什么是accept()循环吗?你的意思是在无限循环中编写accept()语句,这样它就不会阻塞,如果是这样的话,使用无限循环不是一个坏方法吗?
  • 不,我的意思不是“在无限循环中编写 accept() 语句,因此它永远不会阻塞”。它确实阻塞,我已经说过了。你必须把它放在一个循环中这样你就可以接受多个连接。我不知道你从哪里得到关于无限循环的奇怪理论。
  • 没有真正理解你的意思,我在网上看到了关于如何把它放在一个循环中的例子,但是只有一个接受语句,一旦我添加另一个接受它就会阻塞,对于理论,我在 Martin Fowler 的《重构:改进现有代码的设计》一书中读到了它,他不鼓励使用无限循环。
  • 我编辑了我的代码以了解您是否有类似的意思
  • 你能试试看我写的东西吗? '两个线程中的两个接受循环'。不是在一个线程中的一个循环中调用两次accept()。
猜你喜欢
  • 2019-02-20
  • 2011-04-08
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多