小编先习惯性的看了下某中文百科网站对Web Socket的介绍,觉得很囧。如果大家按照这个答案去参加BAT等互联网公司的前端开发面试,估计会被鄙视。
还是让我们阅读一些英文材料吧。
让我们直接看stackoverflow上的原文,然后翻译:
原文地址:
这个讨论有超过8万的阅读量。
首先我们来阅读这段有166个赞的回答:
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 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发送一个消息“汪子熙”:
在调试器里看到的这个字符串作为回调函数的输入参数注入到函数体内:
Chrome开发者工具里观察到的WebSocket消息体:
下次面试被面试官问到TCP和WebSocket套接字的区别,相信大家应该能够知道如何回答了。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
C++开发基于TCPsocket实现的web服务器源码。基于TCP socket实现的支持报文解析并返回响应报文的Web服务器,可以响应多种文件需求并能够处理特定的错误情况 服务器实现及其功能: 1、读取配置文件,为服务器自身设置...
android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信
SpringMVC的Socket实现+Java Tomcat websocket实现+Java Socket通信实现 +Java UDP通信实现。websocket_study.rar 为springMVC版本的socket实现 websocket02.rar 里面包含tomcat的websocket实现+java socket双向通信...
前言我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服...阅读 2,034评论 4赞 105广告评论
HP-Socket_TCP_&_UDP_通信框架开发指南
介绍基于TCP协议通过socket实现网络编程常用API,示例代码:web服务端的编写,实现用户登录及多级页面
unix socket example for tcp and udp
java socket client 断线重连的简单实现 有什么意见可以提哦
在VC 6.0 上编译通过,适用于端口扫描,在不知道端口的情况下,前提是知道了对方IP。可以设定端口起始点和终止点。
一个应用linux socket 编程的http web server 基于 ip/tcp 协议
简单的web实现,在我以前的TCP修改的
基于TCP的socket程序实现,实现客户端和服务器端的连续传送!
内容索引:脚本资源,Ajax/JavaScript,Js框架 迈云 JavaScript Socket 类,使用此库可以直接在网页上创建 Socket TCP 连接,并与服务端连接,发送和接收数据。拥有完善的 Socket 接口,更方便操作。 Socket 适用于...
里面包括源码和可执行文件、我是在linux下用gcc编译的可执行文件只能运行在linux下
TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案。 下面是一份简要的使用流程: TCP通信测试: 1) 创建TCP Server 选中左方的TCP Server, 然后点击”...
HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言...
tcp server
今天给大家介绍一个开源的轻量级跨平台实时HTML+C#.NET Web应用程序开发框架——DotNetify,允许你在C#.NET后端上创建具有React、React Native、Vue或Blazor 前端的实时、响应式、跨平台应用程序。 它的主要特点是...
本教程实现:服务器和客户端双向通信。 让不懂SuperSOCKET的初学人员可以快速(只花几分钟的功夫)搭建自己的简易服务器。先从大方向讲解要做哪些基础工作(下载哪些组件,组件该如何配置),然后叙述要编写哪几步...