当前位置:首页 > JavaScript

js实现socket

2026-03-14 07:16:50JavaScript

Socket通信基础

Socket通信分为WebSocket和原生TCP/UDP Socket两种常见形式。浏览器环境通常使用WebSocket API,Node.js环境可同时支持WebSocket和原生Socket。

WebSocket实现(浏览器端)

浏览器通过WebSocket对象实现双向通信:

const socket = new WebSocket('ws://example.com/socket');

socket.onopen = () => {
  console.log('连接已建立');
  socket.send('Hello Server!');
};

socket.onmessage = (event) => {
  console.log('收到消息:', event.data);
};

socket.onclose = () => {
  console.log('连接已关闭');
};

Node.js原生Socket

使用net模块创建TCP Socket客户端:

js实现socket

const net = require('net');
const client = net.createConnection({ port: 8080 }, () => {
  console.log('连接到服务器');
  client.write('TCP数据包');
});

client.on('data', (data) => {
  console.log('收到数据:', data.toString());
});

client.on('end', () => {
  console.log('连接断开');
});

WebSocket库(Node.js服务端)

使用ws库创建WebSocket服务器:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    console.log('收到消息:', message);
    ws.send('服务端回应');
  });
});

Socket.IO方案

提供更高级的抽象,支持自动重连和房间功能:

js实现socket

// 客户端
const io = require('socket.io-client');
const socket = io('http://localhost:3000');
socket.emit('chat message', 'Hello Socket.IO');

// 服务端
const io = require('socket.io')(3000);
io.on('connection', (socket) => {
  socket.on('chat message', (msg) => {
    io.emit('chat message', msg);
  });
});

二进制数据传输

WebSocket支持二进制数据交换:

// 发送ArrayBuffer
const buffer = new ArrayBuffer(8);
socket.send(buffer);

// 发送Blob数据
const blob = new Blob(['binary data']);
socket.send(blob);

错误处理机制

必须添加错误监听器:

socket.onerror = (error) => {
  console.error('WebSocket错误:', error);
};

// Node.js中
client.on('error', (err) => {
  console.error('Socket错误:', err);
});

心跳检测实现

保持长连接活性:

// 客户端心跳
setInterval(() => {
  if (socket.readyState === WebSocket.OPEN) {
    socket.send('PING');
  }
}, 30000);

// 服务端超时处理
wss.on('connection', (ws) => {
  ws.isAlive = true;
  ws.on('pong', () => ws.isAlive = true);
});

setInterval(() => {
  wss.clients.forEach((ws) => {
    if (!ws.isAlive) return ws.terminate();
    ws.isAlive = false;
    ws.ping(null, false, true);
  });
}, 5000);

标签: jssocket
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…