BIO 等待客户端请求
implAccept(s)
做了几件事:
1. 为Socket对象创建Impl对象,和ServerSocket的Impl属性创建过程一样
2. 执行ServerSocket.Impl.accept,也就是SocksSocketImpl,之后的过程其实也能想到,还是调用DualStackPlainSocketImpl 实现
accept
执行impl.accept(delegate),这里的impl和delegate都是DualStackPlainSocketImpl,暂时没明白为什么要复制一个delegate对象作为DualStackPlainSocketImpl#accept的入参。
SocketAccept
这里timeout确实为0,代表阻塞式连接,就一直等着。
如果是需要非阻塞
// 3.1 serverSocket 设置成非阻塞模式
configureBlocking(nativefd, false);
try {
// 3.2 本地方法,阻塞 timeout 时长用于获取新的 socket
waitForNewConnection(nativefd, timeout);
// 3.3 因为现在是非阻塞的,不管有没有连接都会马上返回
newfd = accept0(nativefd, isaa);
if (newfd != -1) {
// 3.4 新建立的 Socket 设置为阻塞模式
configureBlocking(newfd, true);
}
} finally {
// 3.5 serverSocket 恢复为阻塞模式
configureBlocking(nativefd, true);