小白来请教一下,长连接是什么,是不是所有的长链接之后都是 while(true)来获得消息?

2021-01-08 11:04:45 +08:00
 pinews
最近在看消息队列,有的用 while true,有的用事件,不知道事件背后是不是也是 while true,这个是正常情况吗,所有语言都是这样吗?
4552 次点击
所在节点    PHP
27 条回复
pinews
2021-01-08 16:25:45 +08:00
哦 感谢大神们
jeffh
2021-01-08 16:47:18 +08:00
以下是个人见解,有问题可以指出。只是大概,不抠细节。
1. 长连接,首先它是连接,是 tcp 的概念而不是 udp,因为 udp 不需建立连接。
2. 长连接的“长”是应用层来维持的,和 tcp 无关。应用层可以使用心跳等机制实现。
3. tcp 建立连接后需要发送 FIN 包才会断掉连接,否则不会断。如果断网了之后一直不联网。tcp 有保活机制,默认 2 小时一次,发送 9 个探针,都没回应的话会断掉连接。
4. 至于 while true 的问题,网卡获取到消息后会发起中断,操作系统调入你的程序运行。
5. 你的 while true 程序做好阻塞或者休眠就行,会释放 CPU 资源
aJieK
2021-01-08 17:00:23 +08:00
@julyclyde 哈哈哈哈,一开始在想为什么不能写 true,然后再一看,哈哈哈哈,之前犯过很多次了
keepeye
2021-01-08 17:08:01 +08:00
所谓长连接就是不关闭的 TCP 连接,短连接呢就是每个请求都去创建一个新的连接,响应结束后主动 close 掉连接。
keepeye
2021-01-08 17:14:24 +08:00
php 的 socket 超时时间呢,应该分为连接超时和读超时,这个超时是为了类似防止拔网线等意外情形导致无法获知连接已经失效了,到达超时时间没有收到数据后,主动 close
xiangbohua
2021-01-08 20:09:20 +08:00
我是这么的理解的。
说长连接的话,应该说的是 TCP 协议的长连接,那就要提到 tcp 连接是怎么连接的了。那么所谓的连接,就是两台电脑(说计算机室不是高大上一点啊)两个进程通过物理信道接受数据了。这里面感觉会牵涉到操作系统怎么样把网卡接收到的数据传给指定的进程输入。
当一个进程通过调用接口告知操作系统,我需要持续接受来自某个端口的时候数据,并且对方计算机表示会持续发送数据的时候我觉得应该就算是建立了长连接吧。
有可能是 while true 也有可能是某种阻塞中断吧。
(聊到这个感觉自己好菜)
nthhdy
2021-01-08 22:12:19 +08:00
@Rheinmetal 基本是的。不过还有,有些地方是硬件中断

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

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

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

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

© 2021 V2EX