node配置https和搭建sockei.io

服务端

var app = require('express')();
var fs = require('fs');
var db = require('./mysql.js');
var express = require('express');
/**引入证书*/
var options = {
  key: fs.readFileSync('./2_www.fxg1997.top.key'),
  cert: fs.readFileSync('./1_www.fxg1997.top_bundle.crt')
};
/**配置https*/
var https = require('https').Server(options, app);
/**引入socket.io*/
var io = require('socket.io')(https);
https.listen(9528, function () {
  console.log('listening on *:9528');
});
app.use('/web', express.static('web'));
/**设置跨域访问,允许所有跨域*/
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", ' 3.2.1')
  res.header("Content-Type", "application/json;charset=utf-8");
  next();
});
/*判断电脑还是手机*/
app.get('/', function (req, res) {
  var deviceAgent = req.headers["user-agent"].toLowerCase();
  var agentID = deviceAgent.match(/(iphone|ipod|ipad|android)/);
  if (agentID) {
    res.end('请用电脑打开');
  } else {
    res.redirect('./web/test/index.html')
    res.end();
  }
  res.redirect('./web/test/index.html')
  res.end();
});
/**重定向网页*/
app.get('/dist', function (req, res) {
  res.redirect('./web/dist/index.html')
  res.end();
})
app.get('/test', function (req, res) {
  res.redirect('./web/test/index.html')
  res.end();
})
/*读取单个html*/
app.get('/websocket', function (req, res) {
  fs.readFile('./websoket.html', 'utf-8', function (err, data) {
    if (err) {
      throw err;
    }
    res.end(data);
  });
})
/** 
  *system所有支线客户端接受消息
  *public为公共消息,户端会显示,最高级别信息
  *Init初始化连接
  *logined为登录后的系统消息,客户端会显示,并且会加载用户列表和对应的记录
  *privatechat私聊消息
**/
/**
 * 发送给当前客户端
  socket.emit('hello', 'can you hear me?', 1, 2, 'abc');
  发送给所有客户端,除了发送者
  socket.broadcast.emit('broadcast', 'hello friends!');
 **/
var users = {};
io.on('connection', function (socket) {
  socket.emit("Init", '建立连接');
  /*用户上线*/
  socket.on('login', function (user) {
    let obj = JSON.parse(user)
    users[obj.Id] = socket.id;
    socket.emit("logined");
    console.log('新用户上线:', users)
  })
  /*私聊信息交互*/
  socket.on('msg', function (data) {
    var obj = JSON.parse(data)
    console.log(data)
    if (users[obj.toId] == undefined) {
      socket.emit('public', '用户还未上线'); // 将消息发给当前用户
    } else {
      var addSql =
        'INSERT INTO chatlist(Id,content,type,formId,toId,createTime) VALUES (0,?,?,?,?,NOW())'
      let modSqlParams = [obj.content, obj.type, obj.Id, obj.toId];
      console.log(modSqlParams)
      db.query(addSql, modSqlParams, function (err, result) {
        if (err) {
          console.log('[INSERT ERROR] - ', err.message);
          return;
        }
        let req = {
          type: obj.type,
          createTime: new Date(),
          content: obj.content,
          toId: obj.toId,
          formId: obj.Id,
        }
        io.to(users[obj.toId]).emit('privatechat', JSON.stringify(req));
        socket.emit('privatechat', JSON.stringify(req));
      });
    }
  });
  /*监听用户退出*/
  socket.on('loginOut', function (data) {
    var obj = JSON.parse(data)
    delete users[obj.Id]
  });
  /*监听客户端断线,仅仅指空间名*/
  socket.on('disconnect', function () {
    for (let key in users) {
      if (users[key] == socket.id) {
        delete users[key]
      }
    }
    /*断开底层连接,也就是这个客户端的socket链接
    */
    setTimeout(() => socket.disconnect(true), 200);
    console.log('断线', users)
  });
});
/*
*关闭服务io.close();
*/

客户端

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>how to use socket</title>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/socket.io/1.7.3/socket.io.min.js"></script>
  </head>
  <body>
    <form action="#">
      <input type="text" id="login_name" />
      <input type="text" id="password" />
      <button id="send">login</button>
      <button id="loginout">loginout</button>
    </form>
    <ol></ol>

    <form action="#">
      <input type="text" id="text" />
      <button id="sendmsg">send</button>
    </form>
    <script>
      var socket;
      var login_name;
      // 1. 与服务器端建立连接

      //const socket = io.connect("http://localhost:3000");
      // 2. 监听send按钮点击的事件
      $("#send").click(function () {
        // // 获取输入的信息
        login_name = $("#login_name").val().trim();
        let password = $("#password").val().trim();
        let data = {
          login_name: login_name,
          password: password,
        };
        $.get("http://localhost:9528/login", data, function (data, status) {
          console.log(data);
          if (data.status == 200) {
            socket = io.connect("http://localhost:9528");
            socket.on("message", (message) => {
              if (login_name == message.fromId) {
                $("ol").append("<li>我:" + message.msg + "</li>");
              }
            });
            /*断开的回调*/
            socket.on("disconnect", function () {
              console.log("服务器端主动断开连接.");
            });
          }
        });
        //登录
      });
      $("#loginout").click(function () {
        // 向服务器端断开信息
        socket.disconnect();
        //登录
      });
      $("#sendmsg").click(function () {
        // // 获取输入的信息
        let value = $("#text").val().trim();
        // 向服务器端发送信息
        socket.emit("message", { fromId: login_name, toId: "2", msg: value });
      });
      // socket.on('login', message => {
      // 	console.log(message);
      // });
    </script>
  </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卤鸽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值