nodejs,net模块
单工
半双工的通信通道搭建
发送,然后登台接收,然后再发送

socket 套接字通信
交换机通信
web通信技术 https://zhuanlan.zhihu.com/p/21573180

轮询,每个一秒钟请求一次服务器,例如 定时器
长轮询

全双工通信的关键

  • 在于应用层协议,需要有标记包段的信号
  • 处理一下情况,需要有标记包长的字段
    • 粘包
    • 不完整包
  • 错误处理

server

  1. const net = require('net');
  2. const server = net.createServer((socket) => {
  3. socket.on('data', function(buffer) {
  4. console.log(buffer);
  5. const seqBuffer = buffer.slice(0, 2);
  6. const lessonid = buffer.readInt32BE(2);
  7. setTimeout(()=> {
  8. // console.log(data[lessonid])
  9. const buffer = Buffer.concat([
  10. seqBuffer,
  11. Buffer.from(data[lessonid])
  12. ])
  13. socket.write(
  14. buffer
  15. );
  16. }, 10 + Math.random() * 1000)
  17. })
  18. });
  19. server.listen(4000);
  20. const data = {
  21. 136797: "01 | 课程介绍",
  22. 136798: "02 | 内容综述",
  23. 136799: "03 | Node.js是什么?",
  24. 136800: "04 | Node.js可以用来做什么?",
  25. 136801: "05 | 课程实战项目介绍",
  26. 136803: "06 | 什么是技术预研?",
  27. 136804: "07 | Node.js开发环境安装",
  28. 136806: "08 | 第一个Node.js程序:石头剪刀布游戏",
  29. 136807: "09 | 模块:CommonJS规范",
  30. 136808: "10 | 模块:使用模块规范改造石头剪刀布游戏",
  31. 136809: "11 | 模块:npm",
  32. 141994: "12 | 模块:Node.js内置模块",
  33. 143517: "13 | 异步:非阻塞I/O",
  34. 143557: "14 | 异步:异步编程之callback",
  35. 143564: "15 | 异步:事件循环",
  36. 143644: "16 | 异步:异步编程之Promise",
  37. 146470: "17 | 异步:异步编程之async/await",
  38. 146569: "18 | HTTP:什么是HTTP服务器?",
  39. 146582: "19 | HTTP:简单实现一个HTTP服务器"
  40. }

client

  1. const net = require('net');
  2. const socket = new net.Socket({});
  3. socket.connect({
  4. host: '127.0.0.1',
  5. port: 4000
  6. });
  7. const lessonids = [
  8. "136797",
  9. "136798",
  10. "136799",
  11. "136800",
  12. "136801",
  13. "136803",
  14. "136804",
  15. "136806",
  16. "136807",
  17. "136808",
  18. "136809",
  19. "141994",
  20. "143517",
  21. "143557",
  22. "143564",
  23. "143644",
  24. "146470",
  25. "146569",
  26. "146582"
  27. ]
  28. let id = Math.floor(Math.random() * lessonids.length);
  29. socket.on('data', (buffer) => {
  30. const seqBuffer = buffer.slice(0, 2);
  31. const titleBuffer = buffer.slice(2);
  32. console.log(seqBuffer.readInt16BE(), titleBuffer.toString())
  33. })
  34. let seq = 0;
  35. function encode(index) {
  36. buffer = Buffer.alloc(6);
  37. buffer.writeInt16BE(seq)
  38. buffer.writeInt32BE(
  39. lessonids[index], 2
  40. );
  41. console.log(seq, lessonids[index]);
  42. seq++;
  43. return buffer;
  44. }
  45. for (let k = 0; k < 100; k++) {
  46. id = Math.floor(Math.random() * lessonids.length);
  47. socket.write(encode(id));
  48. }