开发者社区> jerrywangsap> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

TCP socket和web socket的区别

简介: 小编先习惯性的看了下某中文百科网站对Web Socket的介绍,觉得很囧。如果大家按照这个答案去参加BAT等互联网公司的前端开发面试,估计会被鄙视。 还是让我们阅读一些英文材料吧。 让我们直接看stackoverflow上的原文,然后翻译: 原文地址: https://stackoverflow.com/questions/16945345/differences-between-tcp-sockets-and-web-sockets-one-more-time 这个讨论有超过8万的阅读量。
+关注继续查看

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

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

让我们直接看stackoverflow上的原文,然后翻译:

原文地址:

https://stackoverflow.com/questions/16945345/differences-between-tcp-sockets-and-web-sockets-one-more-time

这个讨论有超过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套接字的区别,相信大家应该能够知道如何回答了。

本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如果希望监听TCP端口9000,服务器端应该怎样创建socket?
如果希望监听TCP端口9000,服务器端应该怎样创建socket?
0 0
socket库:Python实现TCP/IP客户和服务器通信
socket库:Python实现TCP/IP客户和服务器通信
0 0
【Java】网络编程--Socket与TCP网络通信编程
文章目录 写在前面 1 Socket 2 TCP网络通信编程 2.1 TCP字节流编程 2.1.1 案例:客户端发送数据,服务端接收并显示 2.1.2 案例进阶:双向通信 2.2 TCP字符流编程 2.3 网络上传文件
0 0
网络编程:socket—基于 TCP 协议编程|学习笔记
快速学习网络编程:socket—基于 TCP 协议编程
0 0
Java之初步识别网络编程:IP、端口号、TCP/UDP、Socket、URL等
Java之初步识别网络编程:IP、端口号、TCP/UDP、Socket、URL等
0 0
socket,tcp,http三者之间的区别
socket,tcp,http三者之间的区别
0 0
Socket TCP协议解决粘包、半包问题的三种解决方案
Socket TCP协议解决粘包、半包问题的三种解决方案
0 0
Unity【Socket TCP】- 服务端与客户端通讯的简单示例
Unity【Socket TCP】- 服务端与客户端通讯的简单示例
0 0
java网络编程(2)socket通信案例(TCP和UDP)
java生下来一开始就是为了计算机之间的通信,因此这篇文章也将开始介绍一下java使用socket进行计算机之间的通信,在上一篇文章中已经对网络通信方面的基础知识进行了总结,这篇文章将通过代码案例来解释说明。
0 0
+关注
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
TCP Cluster for mqtt技术实施方案
立即下载
WEB SERVICE EFFICENCY
立即下载
WEB浏览器中即将发生的安全变化
立即下载