V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gramyang
V2EX  ›  Java

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

  •  
  •   gramyang · 2019-12-23 11:28:06 +08:00 · 4107 次点击
    这是一个创建于 1781 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    建议分层去思考, 别把各种细节焊死了
    gramyang
        11
    gramyang  
    OP
       2019-12-23 12:16:50 +08:00
    @yamasa 是的,看来我是被 netty 的示例代码误导了,netty 是双向 nio,而浏览器+netty 后端用的是单向 nio。两者都是 nio
    arraysnow
        12
    arraysnow  
       2019-12-23 13:40:30 +08:00
    和什么 io 没关系。客户端和服务端可以用两套完全不同的 io 模型,在 tcp 协议上不关心双端用什么。同样应用层不关心也没有协商对方用的什么,只要能接到响应就是好的
    neoblackcap
        13
    neoblackcap  
       2019-12-23 15:05:00 +08:00
    @gramyang 堵不堵塞是你具体的实现,没有强制要求网络另外一端是不是堵塞一说。难道你写的服务端我用 Windows 的机器就不能调用?我还异步 IO,用 IOCP 实现呢。压根就不存在堵塞非堵塞的说法。
    年轻人应该多读书,多写代码实验。而不是自己纯猜想。推荐《 UNIX 网络编程》一书。
    no1xsyzy
        14
    no1xsyzy  
       2019-12-23 15:18:17 +08:00
    @gramyang 单向双向这说法也有点问题,阻塞于否不是交流形式(接口),而是说你进行交流的办法(实现)
    “你是否能边说话边走路” 和 “别人是否能边听你说话边走路” 没有关系;反过来也没有。
    no1xsyzy
        15
    no1xsyzy  
       2019-12-23 15:20:17 +08:00
    @gramyang 相比单向、双向,更合理的是叫单边、双边。
    我打 RTS 办不到边造兵边打架,并不影响我的对手可以(所以我轻轻松松就输了)。
    secondwtq
        16
    secondwtq  
       2019-12-23 20:27:12 +08:00
    我作为一个做过一点前端并且翻过一点 WebKit 源码的人居然不知道浏览器里面有个叫 nio 的东西 ...
    iIli1iIliIllLiL
        17
    iIli1iIliIllLiL  
       2020-01-09 14:10:38 +08:00
    不管你后面是异步还是同步,浏览器都是无感知的啊,按照 http 协议交互即可,换个比方就是浏览器换成异步的 ajax,服务器端不需要进行处理一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5715 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:55 · PVG 09:55 · LAX 17:55 · JFK 20:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.