在 3 个不同的线程中使用套接字监听 3 个不同的端口

Listening to 3 different ports using sockets in 3 different threads

我的 main class 定义了 ExecutorService 对象,其中包含 3 个线程的 newFixedThreadPool。

public static void main(String[] args) {
    queue = new ArrayBlockingQueue<HashMap<String, String>>(MAX_QUEUE_LENGTH);
    socketThreads = Executors.newFixedThreadPool(3);

    socketThreads.submit(new MyListener(PORT1, queue));
    socketThreads.submit(new MyListener(PORT2, queue));
    socketThreads.submit(new MyListener(PORT3, queue));
}

Runnable 已提交。 Runnables如下:

public class MyListener implements Runnable {

  private static ServerSocket listener = null;
  // private Socket socket = null;
  private InputStream inStream = null;
  private OutputStream outStream = null;
  private static ArrayBlockingQueue < HashMap < String, String >> queue = null;

  private static Logger LOGGER = LogManager.getLogger(MyListener.class);
  int port;

  public MyListener(int port, ArrayBlockingQueue < HashMap < String, String >> queue) {
    try {
      listener = new ServerSocket(port);
      this.queue = queue;
      this.port = port;
    } catch (IOException e) {
      LOGGER.fatal("Could not connect to the socket, port number: " + port, e);
    }
  }

  @
  Override
  public void run() {

    do {
      try {
        LOGGER.debug("*** 1 ***");
        Socket socket = listener.accept();
        LOGGER.debug("*** 2 ***");

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        HashMap < String, String > map = (HashMap < String, String > ) ois.readObject();

        LOGGER.debug("*** 3 ***");
        queue.add(map);

      } catch (IOException e) {
        LOGGER.fatal("Error in socket connection ", e);

      } catch (ClassNotFoundException e) {
        LOGGER.fatal("Error - Class not found ", e);

      } catch (ClassCastException e) {
        LOGGER.fatal("Error - Class Cast Exception ", e);
      }
    } while (true);
  }
}

所以,基本上套接字读取传入数据并将其添加到队列中。这个想法是,一旦请求进入并获得,套接字应该再次开始等待连接。当我有一个线程池 运行ning 时,我的代码可以工作,但如果我在池中启动 > 1 个线程,我的代码将无法工作。正如您在代码中看到的,执行到达日志语句 * * * 1 * * * 并且从未发生接受。

我试图从中分离出 ObjectnputStream 并且 运行 它是一个单独的 运行nable,但是在阅读 Creating a socket server which allows multiple connections via threads and Java 之后这也无济于事。发生这种情况的任何原因?

  1. ServerSocket不应该是静态的。每次创建新的侦听器对象时都会覆盖它。

  2. 与接受的客户端有关的一切都在错误的地方:它的套接字和它的两个流。这些应该是另一个 Runnable class 的非静态成员,它被实例化以处理每个接受的套接字。