`
JerryWang_SAP
  • 浏览: 1030187 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

TCP socket和web socket的区别

阅读更多

小编先习惯性的看了下某中文百科网站对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套接字的区别,相信大家应该能够知道如何回答了。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

 

 
0
0
分享到:
评论

相关推荐

    C++开发基于TCPsocket实现的web服务器源码.zip

    C++开发基于TCPsocket实现的web服务器源码。基于TCP socket实现的支持报文解析并返回响应报文的Web服务器,可以响应多种文件需求并能够处理特定的错误情况 服务器实现及其功能: 1、读取配置文件,为服务器自身设置...

    OIM是采用 Java平台开发的一套即时通讯聊天系统,献给对即时务端实现了TCP Socket和WebSo.zip

    OIM是采用 Java平台开发的一套即时通讯聊天系统,献给对即时通讯有兴趣的朋友。服务端实现了TCP Socket和WebSo

    tcp socket通讯库

    "JsSocket"可能是一个JavaScript库,允许在Web应用中使用TCP Socket,这通常通过Node.js环境实现,因为浏览器不直接支持TCP套接字。 在实际开发中,封装TCP Socket库通常会包括以下功能: - 连接管理:自动处理...

    TCP与串口间的通信方式。Socket通信

    本文将深入探讨TCP与串口间的通信方式,以及如何利用Socket进行同步和异步通信。 首先,TCP是一种面向连接的、可靠的传输层协议,它提供全双工的数据通信,并确保数据包按顺序无错误地到达目的地。TCP通过三次握手...

    socket_TCP.rar_c TCP socket

    - Web服务器与浏览器之间的通信就是基于TCP socket的。 - FTP、SMTP、HTTP等应用层协议都构建在TCP之上。 - 自定义的服务端和客户端通信也常采用TCP socket。 理解TCP socket编程不仅需要掌握C语言,还需要对...

    web监听端口(Socket服务随web启动而启动)

    总的来说,"web监听端口(Socket服务随web启动而启动)"这一技术能够提升Web应用的交互性和实时性,是现代Web开发中不可或缺的一部分。通过深入理解Socket和Tomcat的工作原理,开发者可以更好地设计和实现这类功能。

    js+socket实现web通讯

    在现代Web开发中,为了实现实时双向通信,JavaScript结合Socket技术(通常指的是WebSocket协议)成为一种常见且强大的解决方案。WebSocket是HTML5引入的一个新特性,允许服务器和浏览器之间建立长时间保持连接的通道...

    C#2010 Socket TCP和UDP报文及端口测试工具的开发和源码

    C#是一种广泛用于构建桌面和Web应用的编程语言,它提供了强大的Socket类库来处理TCP和UDP通信。本篇文章将深入探讨如何使用C# 2010开发一个Socket测试工具,包括TCP和UDP报文的发送与接收,以及端口的测试。 首先,...

    socket 、webservices、Json的区别

    标题中的“socket、web服务(WebServices)、JSON”是三种不同的技术,它们在IT领域有着各自独特的用途。这里我们将深入探讨这些概念以及它们之间的区别。 首先,Socket是网络编程的一个基本概念,它允许两个应用...

    C# 使用Socket发送和接收TCP数据

    C#是一种广泛用于构建桌面和Web应用程序的编程语言,它提供了强大的网络编程能力,其中包括使用Socket进行TCP/IP通信。本篇文章将深入探讨如何在C#中使用Socket类来实现TCP数据的发送和接收。 TCP(Transmission ...

    C#利用Socket创建webservice

    在实际操作中,可以参考这个文件来搭建和测试Socket Web服务。 总的来说,利用C#的Socket创建Web服务是一种灵活且自定义程度高的方式,它可以让你绕过HTTP协议栈的复杂性,直接处理网络通信,但同时也需要对网络...

    javaTCP Socket.zip

    在这个"javaTCP Socket.zip"项目中,我们可以看到开发者利用Java的Socket API构建了一个服务器(FinalServer)和一个客户端(FinalClient),以实现数据的双向通信。 首先,让我们深入理解TCP(传输控制协议)和...

    C#基于TCP的Socket多线程通信(包含服务端和客户端)

    C#是一种广泛用于构建桌面和Web应用程序的编程语言,它提供了强大的网络编程能力,其中包括使用TCP Socket进行多线程通信。本篇文章将深入探讨C#中基于TCP的Socket多线程通信,包括服务端和客户端的实现。 TCP...

    利用socket 编写web 服务器的源代码

    我们将基于标题和描述中的内容,讲解socket编程的基本概念、Web服务器的工作原理以及如何用源代码实现这一过程。 一、Socket编程基础 Socket,通常称为套接字,是进程间通信的一种方式,它允许两个网络应用程序之间...

    c# supersocket 控制台+web样例

    首先,SuperSocket是一个轻量级的Socket服务端开发框架,支持TCP和UDP通信协议。它的核心功能包括连接管理、数据传输和自定义协议解析。开发者可以通过简单的API快速构建Socket服务器,处理客户端的连接请求和数据...

    C# Socket编程完成控制台服务器端和web客户端(调试通过)

    C# Socket 编程完成控制台服务器端和 web 客户端(调试通过) C# Socket 编程是指使用 C# 语言实现的 Socket 编程技术,用于创建网络通信的服务器端和客户端程序。在本例中,我们将创建一个控制台服务器端和一个 ...

    基于Socket的WEB服务器

    在TCP/IP协议栈中,Socket提供了一种接口,让开发者能够编写客户端和服务器应用程序,实现网络通信。 在基于Socket的WEB服务器中,服务器端的Socket用于监听客户端的连接请求。一旦有新的连接到来,服务器会创建一...

    TCP-IP socket programming in ABAP_in_TCPIPABAP_

    在ABAP中,TCP/IP socket通信主要依赖于以下ABAP类和函数模块: 1. `CL_SOCK`: 这是ABAP的内置类,用于创建和管理TCP/IP套接字。它提供了打开、关闭、读取、写入等基本操作。 2. `FUNCTION GROUP SOCK`: 这是一组...

    C# Socket Tcp文件传输和文字聊天系统

    标题中的"C# Socket Tcp文件传输和文字聊天系统"是指使用C#编程语言,基于Socket和TCP协议实现的一个功能,它涵盖了文件传输和文字聊天两大功能。Socket是网络通信中的一个基本概念,它允许两个网络应用进行数据交换...

    NET5 WebApi使用SuperSocket2.0发送到桌面客户端程序源码

    这个项目源码的价值在于它提供了一个实际的示例,展示了如何结合.NET 5 Web API和SuperSocket 2.0来构建一个实时通信系统。对于学习者来说,通过分析源码,可以深入了解这两种技术的结合使用,以及服务器主动推送...

Global site tag (gtag.js) - Google Analytics