【问题标题】:Does the node.js callback mimic the java accept socket?node.js 回调是否模仿 java 接受套接字?
【发布时间】:2014-04-14 04:03:21
【问题描述】:

不久前我在 node.js 中编写了一些代码,我使用套接字的魔力来完成我想要的。

io.sockets.on("connection", function(socket){ //code });

我从这段代码中了解到,作为回调参数提供的套接字是刚刚连接的套接字,并且只是将代码提供给回调。但是最近我尝试将一点移入 java 并且遇到了以下代码:

ServerSocket client_socket = new ServerSocket(port);
Socket socket = client_socket.accept();

我现在的问题是,accept 函数是否会按照回调在 ​​node.js 中的执行方式获取刚刚连接的套接字?

【问题讨论】:

    标签: java node.js sockets


    【解决方案1】:

    不完全一样。 #accept() 阻塞直到建立连接。异步运行代码的解决方案,在ExecutorService

     class NetworkService implements Runnable {
       private final ServerSocket serverSocket;
       private final ExecutorService pool;
    
       public NetworkService(int port, int poolSize)
           throws IOException {
         serverSocket = new ServerSocket(port);
         pool = Executors.newFixedThreadPool(poolSize);
       }
    
       public void run() { // run the service
         try {
           for (;;) {
             pool.execute(new Handler(serverSocket.accept()));
           }
         } catch (IOException ex) {
           pool.shutdown();
         }
       }
     }
    
     class Handler implements Runnable {
       private final Socket socket;
       Handler(Socket socket) { this.socket = socket; }
       public void run() {
         // read and service request on socket
       }
     }
    

    如果您在另一个 executorservice 中运行 NetworkService,它不会阻塞,而是在 poolSize 单独的线程中执行代码。这与单线程的 node.js 不同。

    您也可以调用getChannel 并将其与Selector 一起使用以保持事情不阻塞。

    【讨论】:

    • 关于 ExecutorService 的快速问题。它是否为每个连接的套接字创建一个新线程,然后将其作为可运行的参数提供?
    • 不,Executors.newFixedThreadPool(4) 创建 4 个线程。 Handler-runnables 自动在这 4 个线程之一上运行。处理程序构造函数将套接字作为参数,并且可以在其 run() 方法中使用它。如果处理程序很慢,并且有 5 个连接进来,则第 5 个连接必须等到前 4 个连接之一完成。
    猜你喜欢
    • 2013-07-17
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多