Внутренняя реализация метода 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()?