• 搭一个聊天室


    WebSocket 是什么?

    • 建立在 TCP 协议之上的网络通信协议
    • 全双工通信协议
    • 没有同源限制
    • 可以发送文本、二进制数据等

    NodeJS插件
    目前最出色的两个插件是socket.iows

    浏览器连接
    前端连接服务的API叫WebSocket
    也可以用别人封装好的socket.io,跟上面的NodeJS是同一家的,但是是HTML使用的

    网上的代码很多,找了两份好理解的

    代码一
    ws插件+原生

    npm install ws --save
    
    // app.js
    const PORT = 8080; // 监听端口
    const WebSocket = require("ws"); // 引入 ws 库
    
    const wss = new WebSocket.Server({ port: PORT }); // 声明wss对象
    
    /**
     * 已经连接中的用户发送数据触发
     * 向除了本身之外所有客户端发送消息,实现群聊功能
     * @param {*} data 要发送的数据
     * @param {*} ws 客户端连接对象
     */
    wss.broadcastToElse = function broadcast(data, ws) { 
      wss.clients.forEach(function each(client) {
        if (client !== ws && client.readyState === WebSocket.OPEN) {
          // 把A的话发送给除了A以外的其他人
          client.send(data);
        }
      });
    };
    
    /* 客户端接入,触发 connection */
    wss.on("connection", function connection(ws, req) {
      // 通过req对象可以获得客户端信息,比如:ip,headers等
      let ip = req.connection.remoteAddress; 
      
      /* 客户端发送消息,触发 message */
      ws.on("message", function incoming(message) { 
        ws.send(message); // 向客户端发送消息
        wss.broadcastToElse(message, ws); // 向 其他的 客户端发送消息,实现群聊效果
      });
    });
    
    // index.html
    // WebSocket是原生的,不需要插件
    var userName = parseInt(Math.random() * 1000, 10) // 随机用户名, 以标识身份
    
    var sendBtn = $("#send-btn"), // 发送信息按钮
        chatInput = $("#chat-input"), // 聊天信息输入框
        showArea = $("#show-area") // 聊天信息展示框
    
    var ws = new WebSocket("ws://localhost:8080/") // 初始化WebSocket对象
    
    sendBtn.on("click", function () {
        var content = chatInput.val()
        if (content.length === 0) {
            return alert("请不要输入空白内容")
        }
        content = "At " + (new Date()).toString() + "
    " + "来自用户" + userName + "
    " + content // 拼接用户信息、时间信息和消息
        ws.send(content) // 发送消息
        chatInput.val("") // 清空输入框
    })
    // 连接时触发
    ws.onopen = function () { console.log("Conncet open") }
    // 接受消息触发
    ws.onmessage = function (evt) {
        var data = evt.data
        // 刷新聊天信息展示框:显示群聊信息
        showArea.val(showArea.val() + data + "
    
    ") 
    }
    ws.onclose = function () { console.log("Connect close") }
    

    代码二
    安装express,socket.io

    npm install express socket.io --save
    
    // app.js
    var app = require('express')();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    var usocket = [];
    
    app.get('/', function(req, res){
      // 发送文件夹里的index.html页面
      res.sendFile(__dirname + '/index.html');
    });
    
    io.on('connection', function(socket){
      console.log('a user connected')
    
      socket.on("join", function (name) {
        usocket[name] = socket
        io.emit("join", name)
      })
    
      socket.on("message", function (msg) {
        io.emit("message", msg) //将新消息广播出去
      })
    
    });
    
    http.listen(3000, function() {
      console.log('listening on *:3000');
    });
    
    // index.html
    <script src="/socket.io/socket.io.js"></script>
    
    var name   = prompt("请输入你的昵称:");
    var socket = io()
    
    //发送昵称给后端,并更改网页title
    socket.emit("join", name)
    document.title = name + "的群聊"
    // 连接服务器
    socket.on("join", function (user) {
        addLine(user + " 加入了群聊")
    })
    //接收到服务器发来的message事件
    socket.on("message", function(msg) {
        addLine(msg)
    })
    //当发送按钮被点击时
    $('form').submit(function () {
        var msg = $("#m").val() //获取用户输入的信息
        socket.emit("message", msg) //将消息发送给服务器
        $("#m").val("") //置空消息框
        return false //阻止form提交
    })
    
    function addLine(msg) {
        $('#messages').append($('<li>').text(msg));
    }
    
  • 相关阅读:
    关于分区索引对齐
    SQLSERVER 分区表实战
    鱼骨图实践
    Python之路-python(面向对象一)
    Python之路-python(常用模块学习)
    Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)
    Python之路-python(set集合、文本操作、字符编码 )
    Python之路-python数据类型(列表、字典、字符串、元祖)操作
    Python之路-python环境安装和简单的语法使用
    javascript中with语句应用
  • 原文地址:https://www.cnblogs.com/pengdt/p/13070865.html
Copyright © 2020-2023  润新知