websocket与tcp区别_websocket对网络要求

websocket与tcp区别_websocket对网络要求TCP socket和web socket的区别

大家好,又见面了,我是你们的朋友全栈君。

小编先习惯性的看了下某中文百科网站对Web Socket的介绍,觉得很囧。如果大家按照这个答案去参加BAT等互联网公司的前端开发面试,估计会被鄙视。

websocket与tcp区别_websocket对网络要求

还是让我们阅读一些英文材料吧。

让我们直接看stackoverflow上的原文,然后翻译:
websocket与tcp区别_websocket对网络要求

原文地址:

https://stackoverflow.com/que…

这个讨论有超过8万的阅读量。
websocket与tcp区别_websocket对网络要求

首先我们来阅读这段有166个赞的回答:
websocket与tcp区别_websocket对网络要求

When you send bytes from a buffer with a normal TCP socket, the send function returns the number of bytes of the buffer that were sent.
当我们向一个通常的TCP套接字发送一段来自内存buffer中的字节数据时,send系统调用返回的是实际发送的字节数。
If it is a non-blocking socket or a non-blocking send then the number of bytes sent may be less than the size of the buffer.

如果发送数据的目的方套接字是一个非阻塞套接字或者是对写操作非阻塞的套接字,那么send返回的已发送字节数可能小于buffer中待发送字节数。

If it is a blocking socket or blocking send, then the number returned will match the size of the buffer but the call may block.
如果是阻塞套接字,两者会相等,因为顾名思义,如果send系统调用没有把所有待发送数据全部发送,则API调用不会返回。

With WebSockets, the data that is passed to the send method is always either sent as a whole “message” or not at all. Also, browser WebSocket implementations do not block on the send call.

而Web socket和TCP socket的区别,从发送的数据来看,不再是一系列字节,而是按照一个完整的”消息体”发送出去的,这个”消息体”无法进一步再分割,要么全部发送成功,要么压根就不发送,不存在像TCP套接字非阻塞操作那样出现部分发送的情况。换言之,Web Socket里对套接字的操作是非阻塞操作。

websocket与tcp区别_websocket对网络要求

这个区别在维基百科上也有清晰阐述:
Websocket differs from TCP in that it enables a stream of messages instead of a stream of bytes

再来看接收方的区别。
原文:
But there are more important differences on the receiving side of things. When the receiver does a recv (or read) on a TCP socket, there is no guarantee that the number of bytes returned correspond to a single send (or write) on the sender side. It might be the same, it may be less (or zero) and it might even be more (in which case bytes from multiple send/writes are received). With WebSockets, the receipt of a message is event driven (you generally register a message handler routine), and the data in the event is always the entire message that the other side sent.

同理,在TCP套接字的场景下,接收方从TCP套接字读取的字节数,并不一定等于发送方调用send所发送的字节数。而WebSocket呢?WebSocket的接收方从套接字读取数据,根本不是像TCP 套接字那样直接用recv/read来读取, 而是采取事件驱动机制。即应用程序注册一个事件处理函数,当web socket的发送方发送的数据在接收方应用从内核缓冲区拷贝到应用程序层已经处于可用状态时 ,应用程序注册的事件处理函数以回调(callback)的方式被调用。

看个例子:

我通过WebSocket发送一个消息“汪子熙”:

websocket与tcp区别_websocket对网络要求

在调试器里看到的这个字符串作为回调函数的输入参数注入到函数体内:

websocket与tcp区别_websocket对网络要求

Chrome开发者工具里观察到的WebSocket消息体:

websocket与tcp区别_websocket对网络要求

下次面试被面试官问到TCP和WebSocket套接字的区别,相信大家应该能够知道如何回答了。

要获取更多Jerry的原创文章,请关注公众号”汪子熙”:
websocket与tcp区别_websocket对网络要求

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106982.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月21日 下午5:20
下一篇 2022年4月21日 下午5:20


相关推荐

  • VB学习的总体总结一

    VB学习的总体总结一经过对VB20天左右的学习,对其有了一定的了解。我觉得VB这种工具就是通过程序设计,做出软件。那么,可不可以用这种思想理解,VB的程序设计是怎么一步步进行的,给了我们一天主线。而在每一步中我们需要掌握什么,需要注意什么,思考怎么把每一步做的更好。然后就可以享受成果。 我对VB的整体总结为   VB工具就是一颗种子,设计步骤就是树干,步骤中的细节就是树叶,关键在于我们怎么让其枝繁

    2022年6月21日
    28
  • gradle和maven区别

    gradle和maven区别Gradle 和 Maven 都是项目自动构建工具 编译源代码只是整个过程的一个方面 更重要的是 你要把你的软件发布到生产环境中来产生商业价值 所以 你要运行测试 构建分布 分析代码质量 甚至为不同目标环境提供不同版本 然后部署 整个过程进行自动化操作是很有必要的 整个过程可以分成以下几个步骤 编译源代码运行单元测试和集成测试执行静态代码分析 生成分析报告创建发布版本部署到目标环境部署传递过

    2026年3月20日
    2
  • fastclick

    fastclickfastclick–处理移动端click事件300毫秒延迟安装:npminstallfastclick–save   之后,在main.js中引入    importFastClickfrom’fastclick’    并绑定到bodyFastClick.attach(document.body);1、兼容性iOS3及更高版本的移动SafariiOS5及更高版本的C…

    2022年6月19日
    56
  • JAVA队列( Queue ) 详解[通俗易懂]

    JAVA队列( Queue ) 详解[通俗易懂]什么是队列?队列是一种特殊的线性表,遵循先入先出、后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列运行在任何地方插入删除;比如我们常用的LinkedList集合,它实现了Queue接口,因此,我们可以理解为LinkedList就是一个队列;java队列特性队列主要分为阻塞和非阻塞,有界和无界、单向链表和双向链表之分;阻塞和非阻塞阻塞队列入列(删除元素)时,如果元素数量超过队列总数…

    2022年7月9日
    36
  • windows 系统arp命令

    windows 系统arp命令创作人 邮箱 欢迎大家一起技术交流 本博客主要是自己学习的心得体会 只为每天进步一点点 个人座右铭 1 没有横空出世 只要厚积一定发 2 你可以学历不高 你可以不上学 但你不能不学习一 目的熟悉 arp 命令 主要是为了调试 dpdk 和用户态协议栈用的 二 arp 命令 1 arp a 查看当前电脑上的 ARP 映射表 可以看到当前的 ARP 的映射关系是动态的还是静态的 2 arp sw x y zaa bb cc dd

    2026年3月17日
    2
  • pycharm的优势_jupyter pycharm

    pycharm的优势_jupyter pycharm一直用sublime,最近写服务器和客户端的程序时就有些坑了,所以我简单说一下我遇到的他们的区别sublime优点:1.字体好看,界面简洁,看起来很爽2.轻便,直接把目录拖进去就行了,不用创建项目什么的。打开只需0.1秒~但你想要的功能基本都有,还有很多酷炫的插件让你锦上添花3.写代码很酷啊,你去看下sublime官网就知道了,比如多行编辑(这个确实用到过),还有各种快捷键让…

    2022年8月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号