BIO ServerSocket.accept()等待客户端请求

本文深入解析了Java中BIO ServerSocket的accept()方法,包括implAccept(s)、SocketAccept过程,以及源码分析,特别关注了accept0源码和configureBlocking在JVM中的实现,探讨了阻塞与非阻塞连接的处理方式。
摘要由CSDN通过智能技术生成

在这里插入图片描述

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);
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值