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);
}

本文深入解析了Java中BIO ServerSocket的accept()方法,包括implAccept(s)、SocketAccept过程,以及源码分析,特别关注了accept0源码和configureBlocking在JVM中的实现,探讨了阻塞与非阻塞连接的处理方式。
最低0.47元/天 解锁文章
351

被折叠的 条评论
为什么被折叠?



