Внутренняя реализация метода ServerSocket.accept()?

Все знают о программировании сокетов в Java. мы пишем код, как показано ниже:

 ServerSocket serverSocket = new ServerSocket(1234);
 Socket server = serverSocket.accept();

Мы знаем, что создаем объект serverSocket и затем пишем serverSocket.accept(); код для получения запроса клиента. мы знаем это serverSocket.accept(); ждать, пока не придет новый запрос.

но мой вопрос: что serverSocket.accept(); метод внутренне? может быть работает в то время как цикл? как сервер определяет, что любой новый запрос поступил на обслуживание? какова внутренняя реализация serverSocket.accept(); метод? Кто-нибудь имеет представление об этом?

2 ответа

Решение

В Linux ServerSocket.accept() в конечном итоге (в нативном коде) делает accept системный вызов (см. man 2 accept) который блокирует ожидание подходящего входящего соединения.

Здесь нет while цикл в коде Java или в собственном коде. Я понятия не имею, что происходит внутри ядра Linux, но с этого момента это уже не вопрос Java.


То же самое, вероятно, применимо к Java на Windows, а также к C# или любому другому языку программирования, который вы хотели рассмотреть.

Вы можете найти это самостоятельно.

public Socket accept() throws IOException {
    if (isClosed())
        throw new SocketException("Socket is closed");
    if (!isBound())
        throw new SocketException("Socket is not bound yet");
    Socket s = new Socket((SocketImpl) null);
    implAccept(s);
    return s;
}

Как работает accept()?

Другие вопросы по тегам