当前位置:首页 > 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实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…