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

2019-12-23 11:28:06 +08:00
 gramyang

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

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

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631442

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX