WebSocket是一种网络通信协议,他提供了在单个TCP链接上的全双工(双向)通信通道。WebSocket协议于2008年被提出。
WebSocket与HTTP对比
HTTP | WebSocket | |
---|---|---|
连接形式 | 短连接 | 长连接 |
请求方式 | 客户端与服务器之前进行请求-响应形式的通信 | 双工通信协议,客户端与服务器之间可以实时双向通信 |
实时性 | 轮询 | 双向实时通信 |
协议头 | 每次HTTP请求都会带有协议头 | WebSocket只有在首次建立连接的时候会发送协议头 |
websocket通常用于聊天、弹幕、游戏中,开销资源较少。
WebSocket消息类型
创建 WebSocket 对象:
let ws = new WebSocket("ws://example.com/socket");
通过这个构造函数,你可以建立一个新的 WebSocket 连接。参数是你想连接的 WebSocket 服务的 URL。
onopen 事件:
ws.onopen = function(event) { // 连接已经成功建立时会调用此方法 };
当与 WebSocket 服务器的连接成功建立时,该事件会被触发。
通常在逆向时,会在onopen事件中创建心跳链接,例如每10s发送一次数据做校验。onmessage 事件:
ws.onmessage = function(event) { console.log("Received data:", event.data); };
当客户端接收到来自服务器的数据时,该事件会被触发。
一般onmessage中也会携带一定的校验信息,并且本身内容会被加密,所以逆向时一般需要解密成明文数据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); };
当连接关闭时,不论是客户端还是服务器端关闭,该事件都会被触发。
onerror 事件:
ws.onerror = function(error) { console.error("WebSocket Error:", error); };
当连接过程中发生错误时,该事件会被触发。
send 方法:
ws.send("Hello Server!");
使用这个方法,你可以向服务器发送数据。这可以是一个字符串、Blob 或 ArrayBuffer。
- 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) => {})接受消息时触发
3.客户端
const socket = new WebSocket('ws://localhost:9999'); socket.addEventListener('open', function (event) { socket.send('你好,服务器!'); }); socket.addEventListener('message', function (event) { console.log(`来自服务器的消息: ${event.data}`); });
观察客户端、服务端的响应:
- 客户端:
- 服务端:
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)
此处评论已关闭