请教一个浏览器的 io 模型问题 - V2EX
gramyang
V2EX    Java

请教一个浏览器的 io 模型问题

  •  
  •   gramyang Dec 23, 2019 4943 views
    This topic created in 2354 days ago, the information mentioned may be changed or developed.

    譬如 tomcat8,底层的 io 模型由 bio 变成了 nio。那么前端浏览器是如何识别和处理的呢?

    再比如我用 netty 写一个 http 服务器,那么浏览器可以直接连接并处理返回数据吗?

    Supplement 1    Dec 23, 2019
    结合大家的回答,又查了一下相关资料,我觉得应该是我对 nio 的原理存在一些误解:
    浏览器 bio 发送数据和获取反馈,后端用 selector+channel 的方式进行应答,这就是单向 nio。

    而 netty 使用示例里面 client 的示例代码实现的是双向 nio。

    这两者都是 nio。
    17 replies    2020-01-09 14:10:38 +08:00
    neoblackcap
        1
    neoblackcap  
       Dec 23, 2019
    你这样改对浏览器应该都是透明的,bio 跟 nio 的区别是一个是堵塞( blocking ), 一个是非堵塞( non-blocking ),但是这个是不是堵塞都是对你服务器而言的。
    浏览器看到的都是堵塞,即浏览器没有收到回应。
    gramyang
        2
    gramyang  
    OP
       Dec 23, 2019
    @neoblackcap 但是我看到 netty 的 client 端在创建的时候,也是要创建一个 loop 的啊。找你的意思,不创建这个 loop 直接用 socket 连接 netty 后端也是可以的吗?
    momocraft
        3
    momocraft  
       Dec 23, 2019
    浏览器不关心,知道是 TCP 就行了

    发明协议就是为了隐藏底层细节
    gramyang
        4
    gramyang  
    OP
       Dec 23, 2019
    @neoblackcap 说错了,netty 的 client 也是要创建一个 Selector 来开启多路复用的。nio 的模型里,client 和 server 连接的 socket 除了发送数据外还要传递读写事件来触发 io 线程切换
    yamasa
        5
    yamasa  
       Dec 23, 2019
    前端不 care 你是 nio 还是 bio,是 select 还是 epoll。前端就是连接你服务器端口然后 tcp 会话,你 netty 也就是基于 select 模型不断去端口 poll 事件,为什么会跟浏览器有什么关系?
    gramyang
        6
    gramyang  
    OP
       Dec 23, 2019
    @momocraft 总感觉没这么简单
    chendy
        7
    chendy  
       Dec 23, 2019
    都是 HTTP,都是 TCP (目前),和实现无关
    建议冷静思考
    momocraft
        8
    momocraft  
       Dec 23, 2019
    那别人也只好尊重你的“感觉”

    我个人不打算花时间改变你的观点
    yamasa
        9
    yamasa  
       Dec 23, 2019
    后端服务用 nio 或者 netty 写,前端用 bio call 一点问题都没有。前端也根本不需要去考虑后端的 io 模型。
    hitsmaxft
        10
    hitsmaxft  
       Dec 23, 2019
    浏览器和 tomcat 之间的通讯是 http 协议。因此两者感觉不知道具体实现的。

    tomcat 使用 nio/bio 性能并不能直接反应到业务上,更影响不到前端感知。

    个人感觉只是表层地去观察,错觉而已。

    建议分层去思考, 别把各种细节焊死了
    gramyang
        11
    gramyang  
    OP
       Dec 23, 2019
    @yamasa 是的,看来我是被 netty 的示例代码误导了,netty 是双向 nio,而浏览器+netty 后端用的是单向 nio。两者都是 nio
    arraysnow
        12
    arraysnow  
       Dec 23, 2019
    和什么 io 没关系。客户端和服务端可以用两套完全不同的 io 模型,在 tcp 协议上不关心双端用什么。同样应用层不关心也没有协商对方用的什么,只要能接到响应就是好的
    neoblackcap
        13
    neoblackcap  
       Dec 23, 2019
    @gramyang 堵不堵塞是你具体的实现,没有强制要求网络另外一端是不是堵塞一说。难道你写的服务端我用 Windows 的机器就不能调用?我还异步 IO,用 IOCP 实现呢。压根就不存在堵塞非堵塞的说法。
    年轻人应该多读书,多写代码实验。而不是自己纯猜想。推荐《 UNIX 网络编程》一书。
    no1xsyzy
        14
    no1xsyzy  
       Dec 23, 2019
    @gramyang 单向双向这说法也有点问题,阻塞于否不是交流形式(接口),而是说你进行交流的办法(实现)
    “你是否能边说话边走路” 和 “别人是否能边听你说话边走路” 没有关系;反过来也没有。
    no1xsyzy
        15
    no1xsyzy  
       Dec 23, 2019
    @gramyang 相比单向、双向,更合理的是叫单边、双边。
    我打 RTS 办不到边造兵边打架,并不影响我的对手可以(所以我轻轻松松就输了)。
    secondwtq
        16
    secondwtq  
       Dec 23, 2019
    我作为一个做过一点前端并且翻过一点 WebKit 源码的人居然不知道浏览器里面有个叫 nio 的东西 ...
    iIli1iIliIllLiL
        17
    iIli1iIliIllLiL  
       Jan 9, 2020
    不管你后面是异步还是同步,浏览器都是无感知的啊,按照 http 协议交互即可,换个比方就是浏览器换成异步的 ajax,服务器端不需要进行处理一样。
    About     Help     Advertise     Blog     API     FAQ     Solana     5541 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 07:23 PVG 15:23 LAX 00:23 JFK 03:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86