【NodeJS】nodejs提供websocket服务

发布时间:2024年01月18日

背景

在开发业务系统的时候,根据开发人员不同的技术栈,会使用不同的技术来开发微服务。本文是基于NodeJS提供的websocket的服务。在websocket通过分片的方式将字符串进行切割传递。

正文

1、源码

server.js:

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (socket) => {  
  console.log('Client connected');

  // 模拟分片传输  
  var message = 'Hello, WebSocket!数据映射的方式有两种:';  
  
  console.log(message.length);   
  
  const chunkSize = 5;  
  const totalChunks = Math.ceil(message.length / chunkSize);

  for (let i = 0; i < totalChunks; i++) {  
    const start = i * chunkSize;  
    const end = i === totalChunks - 1 ? message.length : start + chunkSize;  
    const chunk = message.slice(start, end);

    socket.send(chunk);  
    console.log(`Sending chunk ${i + 1}/${totalChunks} - ${chunk}`);  
  }

  socket.on('close', () => {  
    console.log('Client disconnected');  
  });  
});

console.log('Server is running on port 8080'); 

client.js:

const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', () => {  
  console.log('连接已建立');

  // 发送握手请求  
  ws.send(  
    JSON.stringify({  
      Upgrade: 'websocket',  
      Connection: 'Upgrade',  
      //Sec_WebSocket_Accept: createSecWebSocketAccept(ws),  
    })  
  );

  // 发送分片消息  
  const message = 'Hello, WebSocket!';  
  const parts = chunk(message, 1024);  
  parts.forEach((part, index) => {  
    ws.send(JSON.stringify({ type: 'split', parts: [part], index: index }));  
  });

  // 接收响应  
  ws.on('message', (message) => {  
    //const data = JSON.parse(message);  
    //if (data.type === 'response') {  
    console.log('接收到的响应:', message);  
    //}  
  });

  // 关闭连接  
  ws.on('close', () => {  
    console.log('连接已关闭');  
  });  
});

function chunk(str, size) {  
  const chunks = [];  
  for (let i = 0; i < str.length; i += size) {  
    chunks.push(str.slice(i, i + size));  
  }  
  return chunks;  
}

function createSecWebSocketAccept(ws) {  
  const key = ws.url.split('=').pop();  
  const AcceptKey = WebSocket.createSecureContext().SecureSocket.prototype.sec_websocket_accept;  
  return AcceptKey.replace('$WS_KEY$', key);  
}

2、运行

1>、启动server.js

执行命令:

node server.js

运行效果:

2>、启动client.js

执行命令:

node client.js

运行效果:

客户端:

服务端:

3、扩展

Nodejs提供http服务,参考如下案例:

const http = require("http");
 
const hostname = "127.0.0.1";
const port = 3000;
//创建HTTP服务器,并提供两个对象,一个请求(http.IncomingMessage对象)和一个
//响应(http.ServerResponse对象)
const server = http.createServer((req, res) => {
    res.statusCode = 200;//设置statusCode属性为200,以表相应成功
    res.setHeader("Content-Type", "text/plain");//设置Content-Type响应头
    res.end("Hello World1111\n");//关闭响应,添加内容作为end()的参数
})
//服务器启动监听
server.listen(port, hostname, () => {
    console.log(`服务器运行在http://${hostname}:${port}/`);
})

文章来源:https://blog.csdn.net/HWTwilight/article/details/135617089
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。