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

标签 java multithreading socketserver

我的主类定义了带有 3 个线程的 newFixedThreadPool 的 ExecutorService 对象。

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));
}

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);
  }
}

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

我尝试从中分离出 ObjectnputStream 并将其运行为单独的可运行文件,但这在阅读 Creating a socket server which allows multiple connections via threads and Java 后也没有帮助。 。有什么原因会发生这种情况吗?

最佳答案

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

  2. 与接受的客户端有关的所有内容都位于错误的位置:其套接字及其两个流。这些应该是另一个 Runnable 类的非静态成员,该类被实例化以处理每个接受的套接字。

关于java - 使用 3 个不同线程中的套接字监听 3 个不同的端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33528018/

相关文章:

java - 如果我遵循 ISO/IEC 5218,我的 'Person' 类应该有 int sex 吗?

java - 将套接字所有权移至同一 LAN 上的另一台计算机

java - 可运行界面示例

Python - BaseHTTPServer.HTTPServer 并发和线程

C - 使用 read() 从客户端读取整数到服务器

Java套接字客户端到不同网络上的服务器。

java - 从匿名类中检索数据

java - android 上的语言支持

java - 如何创建一个共享计时器,在第一次初始化后减少

c++ - QFuture<void> 检测异常