当前位置: 首页 > 知识库问答 >
问题:

TCP套接字和web套接字之间的差异,再重复一次[重复]

何章横
2023-03-14

为了尽可能地理解TCP套接字和websocket之间的区别,我已经在以下问题中找到了很多有用的信息:

  • WebSocket与纯TCP的根本区别

等等

在我的调查中,我浏览了维基百科上的这句话:

WebSocket与TCP的不同之处在于它支持消息流而不是字节流

我不完全确定这到底是什么意思。你的解读是什么?

共有2个答案

楚俊迈
2023-03-14

WebSocket基本上是一种面向消息的应用协议(参考ISO/OSI网络堆栈),它使用TCP作为传输层。

WebSocket协议背后的思想是重用客户机和服务器之间建立的TCP连接。HTTP握手之后,客户端和服务器通过交换WebSocket信封开始使用WebSocket协议。HTTP握手用于克服客户端和提供某些服务的服务器之间的任何障碍(如防火墙)(通常任何人都可以从任何地方访问端口80)。客户机和服务器可以利用相同的TCP连接(永远不会释放)在任何时候切换说HTTP的HTTP。

幕后WebSocket在一致的信封/消息中重建TCP帧。服务器使用全双工通道以异步方式向客户端推送更新:通道是开放的,客户端可以调用任何期货/回调/promise来管理任何异步WebSocket接收的消息。

简而言之,WebSocket是一个建立在TCP(可靠的传输层,基于每帧)上的高级协议(像HTTP本身),它使得使用JS客户端构建有效的实时应用程序成为可能(以前的Comet和长html" target="_blank">轮询技术用于从实现WebSocket之前的服务器。请参阅Stackoverflow文章:基于回合的游戏服务器的webSocket和长轮询之间的差异)。

单于钊
2023-03-14

当使用普通TCP套接字从缓冲区发送字节时,send函数返回已发送的缓冲区字节数。如果是非阻塞套接字或非阻塞发送,则发送的字节数可能小于缓冲区的大小。如果是阻塞套接字或阻塞发送,则返回的号码将与缓冲区大小匹配,但调用可能会阻塞。对于WebSocket,传递给send方法的数据总是作为整个“消息”发送,或者根本不发送。此外,浏览器WebSocket实现不会阻止发送调用。

但在事情的接受方面还有更重要的区别。当接收器在TCP套接字上执行recv(或read)时,无法保证返回的字节数对应于发送方的一次发送(或写入)。它可能是相同的,可能更少(或零),甚至更多(在这种情况下,从多个发送/写入接收字节)。对于WebSocket,消息的接收者是事件驱动的(通常注册消息处理程序例程),事件中的数据始终是另一方发送的整个消息。

请注意,您可以使用TCP套接字进行基于消息的通信,但您需要一些额外的层/封装,将帧/消息边界数据添加到消息中,以便可以从片段中重新组装原始消息。事实上,WebSockets是在普通TCP套接字上构建的,它使用包含每个帧大小的帧头,并指示哪些帧是消息的一部分。WebSocket API将TCP数据块重新组装到帧中,这些帧在每个消息调用一次消息事件处理程序之前组装到消息中。

 类似资料:
  • 我注意到以下代码在netbeans中是完全合法的: 然而eclipse对此并不满意,我必须这样初始化它: 有趣的是netbean建议不要在初始化部分指定类型参数,而是使用菱形运算符??我想知道这两种方法之间的区别。以及应该使用哪一种,这样代码就可以在不同的IDE中使用而不会有任何变化。

  • 问题内容: 任何人都可以通过TCP发送Ascii msg的示例给我(在网上找不到示例) 谢谢, 射线。 问题答案: 这是一个写入和读取回显服务器的示例。 简化摘录:

  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 我在服务器上有一个专用于套接字的Node/Express应用程序,在客户端上它是Angular 1.5。使用相同的架构(例如单独的套接字服务器)在http上本地运行代码,一切都运行得非常好。 当我在本地运行代码时,它创建了一个连接,并通过xhr进行了很少的轮询。在采用https的cloudflare上,它会进行大量轮询,不断重新连接,并且似乎不是所有消息都会到达web客户端 消息到达cloudfl

  • 我最近一直在玩套接字,但是我遇到了一个问题…当我从服务器接收数据时,我得到一个“java.net.套接字异常:套接字关闭”异常。我没有在任何地方关闭套接字,事实上,我唯一使用关闭()的地方是扫描仪上从System.in读取文本; 以下是我的代码: 客户: 服务器: 数据包发送者: 客户端接收器: 数据包接收器:

  • 问题内容: 我正在构建需要使用套接字连接与另一个应用程序进行通信的Web应用程序。这对我来说是新领域,因此请确保套接字与websockets不同。看来它们只是概念上相似。 发问,因为起初我计划使用Django作为我项目的基础,但是在上面链接的SO帖子中,很清楚地证明websocket是不可能的(或者至少不可靠,即使使用django-websockets之类的东西也是如此) )使用首选的Django