zoukankan      html  css  js  c++  java
  • [Question]Question about "java.net.ServerSocket.accept()"

    Question:
    java.net.ServerSocket.accept() will listen to the specified port for some requests and create a socket.

    But some question bewilder me.

    There is a code :

    ServerSocket serverSocket = new ServerSocket(listenPort);  // Create a server socket to listen to the sepcified port.
          while(true) {  // Keep listening without break.
            Socket incomingConnection = serverSocket.accept();
            handleConnection(incomingConnection);  // Handle the request with multi thread.
          }
        } catch (BindException e) {
            System.out.println("Unable to bind to port " + listenPort);
        } catch (IOException e) {
            System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
        }
    


    The while {} block make the ServerSocket keep listening every time. If there is a request, the accept() method will create a socket and will not be block until a connection is made.

    But ,if there are more than one request at the same time? What will the accept() method process? Will it create sockets for each request at the same time?

    Answer:
    > But ,if there are more than one request at the same
    > time? What will the accept() method process?

    Two network packets don't arrive at the same time on the network card, so there can't be exactly simultaneous connections. (Well, ok, unless you have two network cards and two CPUs...)

    If there are two requests very close to each other, accept() returns one, then the other on the next call.

    accept() will queue requests upto some limit - google for "TCP connection backlog". There is also some backlog stuff in ServerSocket, look at the API. Usually you don't need to worry about it, the default backlog is fine.

    And, as PL says, immediately after accept() returns, fire off a new thread to handle the request. That way your accepting thread can get right back into calling accept(). Then the backlog won't overflow - your CPU is much faster doing accept() than the network card is at receiving new connections.
  • 相关阅读:
    我的Java学习推荐书目
    BTrace使用简介
    BTrace使用小结
    如何在生产环境使用Btrace进行调试
    BTrace : Java 线上问题排查神器
    淘宝Tprofiler工具实现分析
    JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
    性能工具TProfiler介绍文档
    分布式系统理论基础
    微信小程序
  • 原文地址:https://www.cnblogs.com/johnny/p/170729.html
Copyright © 2011-2022 走看看