• node socket.io


    装包:

    yarn add socket.io

     node后台:

    1. const express = require('express')
    2. const http = require('http')
    3. const socket = require('socket.io')
    4. const { getUserInfoByToken } = require('../../utils/light/tools')
    5. let app = express()
    6. const server = http.createServer(app)
    7. const io = socket(server, {
    8. cors: {
    9. origin: [
    10. 'http://localhost:3000',
    11. 'https://xutongbao.top',
    12. 'https://chat.xutongbao.top',
    13. ],
    14. },
    15. })
    16. io.on('connection', async (socket) => {
    17. console.log('已连接', socket.id)
    18. //测试
    19. socket.on('/socket/test', async (data) => {
    20. console.log('data', data)
    21. io.sockets.emit('/socket/test', data)
    22. const ids = await io.allSockets()
    23. console.log(ids)
    24. })
    25. //登录
    26. socket.on('/socket/login', async (req) => {
    27. const ids = await io.allSockets()
    28. let user = await getUserInfoByToken(req.headers.authorization)
    29. global.onlineUsers.push({
    30. socketId: socket.id,
    31. userId: user.uid,
    32. nickname: user.nickname,
    33. })
    34. global.onlineUsers = global.onlineUsers
    35. .filter((item) => [...ids].includes(item.socketId))
    36. .filter((item) => item.userId)
    37. console.log(global.onlineUsers)
    38. console.log('在线人数', global.onlineUsers.length)
    39. io.sockets.emit('/socket/login', req)
    40. })
    41. })
    42. server.listen(84, (res) => {
    43. console.log('socket', 84, res)
    44. })
    45. module.exports = {
    46. io,
    47. }

    前端装包:

    yarn add socket.io-client

    前端代码:

    1. import { io } from 'socket.io-client'
    2. import { socketBaseURL } from '../utils/config'
    3. const socket = io(`${socketBaseURL}`)
    4. function onConnect() {
    5. console.log('登录,已连接', socket.id)
    6. }
    7. socket.on('connect', onConnect)
    8. socket.on('/socket/login', (res) => {
    9. console.log(res)
    10. })
    11. const handleLogin = () => {
    12. let config = {
    13. headers: {},
    14. }
    15. if (config.isNotNeedToken !== true) {
    16. config.headers.authorization = localStorage.getItem('token')
    17. }
    18. if (window.platform === 'rn') {
    19. config.headers.platformos = localStorage.getItem('platformos')
    20. ? localStorage.getItem('platformos')
    21. : 'rn'
    22. config.headers.version = localStorage.getItem('appVersion')
    23. ? localStorage.getItem('appVersion')
    24. : ''
    25. } else {
    26. config.headers.platformos = 'h5'
    27. config.headers.version = window.version
    28. }
    29. config.headers.href = `${document.location.href}?platformos=${config.headers.platformos}&version=${config.headers.version}`
    30. socket.emit('/socket/login', {
    31. ...config,
    32. code: 200,
    33. data: {},
    34. message: '成功',
    35. time: Date.now(),
    36. })
    37. }
    38. export { socket, handleLogin }

     

    1. const socketBaseURL = {
    2. // 使用反向代理解决跨域时,dev应为空字符串
    3. //dev: '',
    4. dev: 'http://172.20.10.4:84', //192.168.0.137 localhost 192.168.1.107 172.20.10.4:84
    5. //dev: 'http://yuying-api.xutongbao.top',
    6. test: '',
    7. //prod: 'http://yuying-api.xutongbao.top',
    8. prod: '' //使用nginx代理解决https请求转发到http
    9. }[process.env.REACT_APP_MODE]
    10. export { socketBaseURL }

     nginx配置

    1. server {
    2. listen 443 ssl;
    3. server_name chat.xutongbao.top;
    4. ssl_certificate /temp/ssl/chat.xutongbao.top/chat.xutongbao.top.crt; # nginx的ssl证书文件
    5. ssl_certificate_key /temp/ssl/chat.xutongbao.top/chat.xutongbao.top.key; # nginx的ssl证书验证密码
    6. #配置根目录
    7. location / {
    8. root /temp/yuying;
    9. index index.html index.htm;
    10. add_header Content-Security-Policy upgrade-insecure-requests;
    11. }
    12. location /api/ {
    13. proxy_set_header X-Real-IP $remote_addr;
    14. proxy_set_header REMOTE-HOST $remote_addr;
    15. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    16. proxy_set_header X-NginX-Proxy true;
    17. proxy_pass http://yuying-api.xutongbao.top;
    18. }
    19. location /socket.io/ {
    20. proxy_set_header X-Real-IP $remote_addr;
    21. proxy_set_header REMOTE-HOST $remote_addr;
    22. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    23. proxy_set_header X-NginX-Proxy true;
    24. proxy_pass http://127.0.0.1:84;
    25. # 关键配置 start
    26. proxy_http_version 1.1;
    27. proxy_set_header Upgrade $http_upgrade;
    28. proxy_set_header Connection "upgrade";
    29. # 关键配置 end
    30. }
    31. # 匹配sslCnd开头的请求,实际转发的请求去掉多余的sslCnd这三个字母
    32. location ^~/sslCnd/ {
    33. proxy_set_header X-Real-IP $remote_addr;
    34. proxy_set_header REMOTE-HOST $remote_addr;
    35. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    36. proxy_set_header X-NginX-Proxy true;
    37. proxy_pass http://cdn.xutongbao.top/;
    38. }
    39. }

     

    nginx配置错误会报错:

  • 相关阅读:
    OpenCV python下载和安装
    如何在arXiv上发表一篇文章
    我的创作纪念日
    java后端调用接口Basic auth认证
    学习ASP.NET Core Blazor编程系列二十五——登录(4)
    libtorch之cv::Mat和Tensor的互转
    vscode设置代码模板
    全能AI客户端:ChatGPT Web Midjourney Proxy,AI绘画+GPT4o对话
    Java框架(八)--SpringMVC拦截器(1)--拦截器开发流程、多Interceptor执行顺序及preHandle返回值
    Unity中Tilemap Layer详解
  • 原文地址:https://blog.csdn.net/xutongbao/article/details/132566929