websocket和socket.io

本文详细介绍了WebSocket和Socket.IO的区别与应用场景。WebSocket是一种全双工、双向通信的协议,适合实时Web应用和游戏场景。Socket.IO是WebSocket的封装库,提供了自动重连和反馈等附加功能,适用于多种实时通信需求。在Vue中使用Socket.IO,需要注意连接地址的动态获取,以避免初始化问题。
摘要由CSDN通过智能技术生成

websocket

三次握手

ws协议和http协议的区别

  1. http

HTTP是单向的,客户端发送请求,服务器发送响应。每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭。每个HTTP或HTTPS请求每次都会新建单独的tcp与服务器的连接,并且在获得响应后,连接将自行终止。http协议通信只能由客户端发起。如果没有socket,只能使用轮询。

http长连接、http和tcp的关系

  • HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
  • 每个HTTP连接完成后,其对应的TCP连接并不是每次都会关闭。从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这个头部字段:Connection:keep-alive
  • 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache,Nginx,Nginx中这个默认时间是 75s)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
  • HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。
  1. websocket

WebSocket是HTML5规范提出的一种协议;WebSocket是双向的,在客户端-服务器通信的场景中使用的全双工协议。该规范定义了ws://以及wss://模式来分别表示WebSocket和安全WebSocket连接,这就跟http:// 以及https:// 的区别是差不多的,服务器网址就是 URL,没有同源限制,客户端可以与任意服务器通信。

以客户端-服务器通信为例,每当我们启动客户端和服务器之间的连接时,客户端-服务器进行握手随后创建一个新的连接,该连接将保持活动状态,直到被他们中的任何一方终止。建立连接并保持活动状态后,客户端和服务器将使用相同的连接通道进行通信,直到连接终止。

新建的连接被称为WebSocket。一旦通信链接建立和连接打开后,消息交换将以双向模式进行,客户端-服务器之间的连接会持续存在。如果其中任何一方(客户端服务器)宕掉或主动关闭连接,则双方均将关闭连接。套接字的工作方式与HTTP的工作方式略有不同,状态代码101表示WebSocket中的交换协议。

WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。

WebSocket连接的过程是:

  • 客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
  • 服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
  • 客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。

全双工:通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。

  1. webscoket和socket的区别
    image

Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。
Socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口,提供一套调用TCP/IP协议的API。
当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。
WebSocket就像HTTP一样,则是一个典型的应用层协议。Socket是传输控制层接口,WebSocket是应用层协议。

  1. http和websocket

websocket和http的区别:1、WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息,而HTTP是单向的;2、WebSocket是需要浏览器和服务器握手进行建立连接的。而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接。

websocket和http的区别

什么是WebSocket,它与HTTP有何不同?

websocket的应用场景

  • 即时Web应用程序:即时Web应用程序使用一个websocket在客户端显示数据,这些数据由后端服务器连续发送。在WebSocket中,数据被连续推送/传输到已经打开的同一连接中,这就是为什么WebSocket更快并提高了应用程序性能的原因。 例如在交易网站或比特币交易中,这是最不稳定的事情,它用于显示价格波动,数据被后端服务器使用websocket字通道连续推送到客户端。
  • 游戏应用程序:在游戏应用程序中,你可能会注意到,服务器会持续接收数据,而不会刷新用户界面。屏幕上的用户界面会自动刷新,而且不需要建立新的连接,因此在WebSocket游戏应用程序中非常有帮助。
  • 聊天应用程序:聊天应用程序仅使用WebSocket建立一次连接,便能在订阅户之间交换,发布和广播消息。它重复使用相同的WebSocket连接,用于发送和接收消息以及一对一的消息传输。

如果我们需要通过网络传输的任何实时更新或连续数据流,则可以使用WebSocket。如果我们要获取旧数据,或者只想获取一次数据供应用程序使用,则应该使用HTTP协议,不需要很频繁或仅获取一次的数据可以通过简单的HTTP请求查询,因此在这种情况下最好不要使用WebSocket。

使用

  • 参数

// 连接
var ws = new WebSocket("wss://echo.websocket.org");

ws.onopen = () => {
    
  console.log("Connection open ..."); 
  ws.send("Hello WebSockets!");
};

ws.onmessage = function(evt) {
   
  console.log( "Received Message: " + evt.data);
  ws.close();
};

ws.onclose = function(evt) {
   
  console.log("Connection closed.");
};      
// {
//   binaryType: "blob" // 连接使用的二进制数据类型。
//   bufferedAmount: 0  // 排队数据的字节数
//   extensions: ""     // 服务器选择的扩展名
//   onclose: null      // 连接关闭的回调函数
//   onerror: null      // 连接错误关闭连接的回调函数
//   onmessage: null    // 收到服务器数据回调函数
//   onopen: ƒ (evt)    // 连接成功回调函数
//   protocol: ""       // 服务器选择的子协议
//   readyState: 3      // 当前状态
//   url: "wss://echo.websocket.org/"  // 连接地址
// }
  • webSocket.readyState

readyState属性返回实例对象的当前状态,共有四种

CONNECTING:值为0,表示正在连接。
OPEN:值为1,表示连接成功,可以通信了。
CLOSING:值为2,表示连接正在关闭。
CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
switch (ws.readyState) {
   
  case WebSocket.CONNECTING:
    // do something
    break;
  case WebSocket.OPEN:
    // do something
    break;
  case WebSocket.CLOSING:
    // do something
    break;
  case WebSocket.CLOSED:
    // do something
    break;
  default:
    // this never happens
    break;
}
  • webSocket.onopen

实例对象的onopen属性,用于指定连接成功后的回调函数。

ws.onopen = function () {
   
  ws.send('Hello Server!');
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值