WebSocket是一种网络通信协议,他提供了在单个TCP链接上的全双工(双向)通信通道。WebSocket协议于2008年被提出。

WebSocket与HTTP对比

HTTPWebSocket
连接形式短连接长连接
请求方式客户端服务器之前进行请求-响应形式的通信双工通信协议,客户端服务器之间可以实时双向通信
实时性轮询双向实时通信
协议头每次HTTP请求都会带有协议头WebSocket只有在首次建立连接的时候会发送协议头

websocket通常用于聊天、弹幕、游戏中,开销资源较少。

WebSocket消息类型

  1. 创建 WebSocket 对象:

    let ws = new WebSocket("ws://example.com/socket");

    通过这个构造函数,你可以建立一个新的 WebSocket 连接。参数是你想连接的 WebSocket 服务的 URL。

  2. onopen 事件:

    ws.onopen = function(event) {
      // 连接已经成功建立时会调用此方法
    };

    当与 WebSocket 服务器的连接成功建立时,该事件会被触发。
    通常在逆向时,会在onopen事件中创建心跳链接,例如每10s发送一次数据做校验。

  3. onmessage 事件:

    ws.onmessage = function(event) {
      console.log("Received data:", event.data);
    };

    当客户端接收到来自服务器的数据时,该事件会被触发。
    一般onmessage中也会携带一定的校验信息,并且本身内容会被加密,所以逆向时一般需要解密成明文数据

  4. onclose 事件:

    ws.onclose = function(event) {
      if (event.wasClean) {
     console.log("Connection closed cleanly");
      } else {
     console.log("Connection closed with an error");
      }
      console.log("Code:", event.code, "Reason:", event.reason);
    };

    当连接关闭时,不论是客户端还是服务器端关闭,该事件都会被触发。

  5. onerror 事件:

    ws.onerror = function(error) {
      console.error("WebSocket Error:", error);
    };

    当连接过程中发生错误时,该事件会被触发。

  6. send 方法:

    ws.send("Hello Server!");

    使用这个方法,你可以向服务器发送数据。这可以是一个字符串、Blob 或 ArrayBuffer。

  7. close 方法:

用来关闭websocket连接
当客户端调用close时,onclose会触发
当发生致命错误时也会触发onclose事件

ws.close(1000, "Work done");

第一个参数是一个状态码,表示关闭的原因,第二个参数是一个可选的字符串描述。

WebSocket使用

1.安装依赖

npm或者yarn安装依赖:

npm install ws

2.服务端

const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// 当有新的客户端连接时触发
wss.on('connection', (ws) => {
  console.log('新的客户端已连接');

  // 当收到客户端消息时触发
  ws.on('message', (message) => {
    console.log(`收到消息: ${message}`);
  });

  // 发送一条消息到客户端
  ws.send('你好,客户端!');
});

server.listen(9999, () => {
  console.log('服务器启动在 http://localhost:9999');
});
  • 第14行ws.on('message', (message) => {})接受消息时触发
  • 第19行使用ws.send向客户端发送字符串或者二进制内容

    3.客户端

    const socket = new WebSocket('ws://localhost:9999');
    
    socket.addEventListener('open', function (event) {
      socket.send('你好,服务器!');
    });
    
    socket.addEventListener('message', function (event) {
      console.log(`来自服务器的消息: ${event.data}`);
    });

观察客户端、服务端的响应:

  • 客户端:

image.png

  • 服务端:

image.png

WebSocket代理

在使用WebSocket的时,有时可能会访问一些访问不到的网站(细品),所以需要在WebSocket中使用代理。

在javascript中使用

const WebSocket = require('ws');
const HttpsProxyAgent = require('https-proxy-agent');

// 代理服务器的地址和端口
const proxy = 'http://your_proxy_host:your_proxy_port';

// 你要连接的WebSocket服务地址
const target = 'ws://your_websocket_server_address';

const agent = new HttpsProxyAgent(proxy);
const ws = new WebSocket(target, { agent });

ws.on('open', function() {
  console.log('WebSocket 连接已打开');
  ws.send('Hello Server!');
});

ws.on('message', function(data) {
  console.log(`从服务器接收到的消息: ${data}`);
});

ws.on('close', function() {
  console.log('WebSocket 连接已关闭');
});

在python中使用

ws = websocket.WebSocketApp(url="wss://.........",
                            cookie='',

                            on_open=on_open,
                            on_message=on_message,
                            on_error=on_error,
                            on_close=on_close)
# 网络环境校验
ws.run_forever(proxy_type='http',http_proxy_host='127.0.0.1',http_proxy_port=7890)
最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏