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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QTcpSocket简单使用[通俗易懂]

    QTcpSocket简单使用[通俗易懂]QTcpServer类提供一个TCP基础服务类继承自QObject这个类用来接收到来的TCP连接,可以指定TCP端口或者用QTcpServer自己挑选一个端口,可以监听一个指定的地址或者所有的机器地址。调用listen()来监听所有的连接,每当一个新的客户端连接到服务端就会发射信号newConnection()调用nextPendingConnection()来接受待处理的连接。返回一个连接的QTcpSocket(),我们可以用这个返回的套接字和客户端进行连接如果有错误,serverErr.

    2022年9月9日
    8
  • 多线程锁有几种类型_进程同步和互斥概念

    多线程锁有几种类型_进程同步和互斥概念一、同步与互斥的概念  现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。在多任务操作系统中,同时运行的多个任务可能:都需要访问/使用同一种资源;多个任务之间有依赖关系,某个任务的运行依赖于另一个任务。【同步】:  是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以…

    2022年8月12日
    8
  • JAVA解析XML格式字符串「建议收藏」

    JAVA解析XML格式字符串「建议收藏」importjava.io.IOException;importjava.io.StringReader;importjava.util.List;importorg.jdom.Document;importorg.jdom.Element;importorg.jdom.JDOMException;importorg.jdom.Namespace;im

    2022年5月27日
    31
  • critic法计算_基于CRITIC法和变异系数法的导线网测量平差定权 2[通俗易懂]

    critic法计算_基于CRITIC法和变异系数法的导线网测量平差定权 2[通俗易懂]基于CRITIC法和变异系数法的导线网测量平差定权杨腾飞,施昆,汪奇生(昆明理工大学国土资源工程学院,云南昆明650093)【摘要】CRITIC与变异系数定权都是一种客观的定权方法,能克服常规经验定权的不足。本文将这两种客观定权方法引入导线网平差中,并与常规定权方法进行比较。由应用实例可验证其优越性。【关键词】客观定权;导线网;CRITIC;变异系数【中图分类号】【文献标识码】【文章编号】Trav…

    2022年5月24日
    39
  • mysql导出数据库

    mysql导出数据库mysql命令行导出数据库mysqldump进行数据库导出备份命令行提示“拒绝访问”

    2022年7月27日
    6
  • HTTP状态404未找到是什么意思_HTTP状态码详解

    HTTP状态404未找到是什么意思_HTTP状态码详解一些常见的状态码为:200-服务器成功返回网页404-请求的网页不存在503-服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码说明100(继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。101(切换协议)请求者已要求服务器切换协议,服务器已确认并准备切换。…

    2025年6月10日
    3

发表回复

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

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