计算 Node.js Socket.IO 应用程序中连接的用户数 Node.js 服务器文件 server.js客户端 HTML文件 index.html客户端 JavaScript 代码文件 sketch.js

如何解决计算 Node.js Socket.IO 应用程序中连接的用户数 Node.js 服务器文件 server.js客户端 HTML文件 index.html客户端 JavaScript 代码文件 sketch.js

我使用 Node.js 创建了一个简单的协作白板绘图应用程序。一切似乎都正常。但是,我对一个小功能有些困惑。

我想在浏览器中显示一条状态消息,显示有多少其他已连接的用户。我已将以下代码添加server.js 文件到 io.sockets.on 连接和断开连接:

// Set connected user counter on connection
var $ipAddress = socket.handshake.address;
if (!$ipsConnected.hasOwnProperty($ipAddress)) {
    $ipsConnected[$ipAddress] = 1;
    count++;
    socket.emit('connectedusers',{
        count: count
    });
}

// Set connected user counter on disconnect
if ($ipsConnected.hasOwnProperty($ipAddress)) {
    delete $ipsConnected[$ipAddress];
    count--;
    socket.emit('connectedusers',{
        count: count
    });
}

然后在文件 sketch.js 中的客户端,我添加了以下内容来设置连接用户的变量并将其分配给 ID 以在 HTML 浏览器中显示

// Set status
socket.on('connectedusers',function (data) {
        var status = "Drawing with " + ((data.count)-1) + " other people";
        document.getElementById("status").innerHTML = status;
    }
);

当客户端运行时,您会看到已连接用户的状态显示为 OK。但是,如果新用户加入,则状态不会更新而无需刷新页面

这是完整的代码

Node.js 服务器(文件 server.js

// Using Express.js: http://expressjs.com/
var express = require('express');

// Create the app
var app = express();

// Set up the server
// process.env.PORT is related to deploying on Heroku
var server = app.listen(process.env.PORT || 3000,listen);

// This call back just tells us that the server has started
function listen() {
    var host = server.address().address;
    var port = server.address().port;
    console.log('Youmeus Draw listening at http://' + host + ':' + port);
}

// Set the root the root directory from which to serve static assets in a directory named public
app.use(express.static('public'));

// WebSocket portion
var io = require('socket.io')(server);


// Set connected user counter variables
var count = 0;
var $ipsConnected = [];


// Register a callback function to run when we have an individual connection
// This is run for each individual user that connects
io.sockets.on('connection',// We are given a WebSocket object in our function
    function(socket) {

        // Send connected message to the console
        console.log("New client has connected: " + socket.id);

        // Set connected user counter on connection
        var $ipAddress = socket.handshake.address;
        if (!$ipsConnected.hasOwnProperty($ipAddress)) {
            $ipsConnected[$ipAddress] = 1;
            count++;
            socket.emit('connectedusers',{
                count: count
            });
        }

        // When this user emits,client side: socket.emit('otherevent',some data);
        socket.on('mouse',function(data) {

                // Data comes in as whatever was sent,including objects
                console.log("Received: 'mouse' " + data.x + " " + data.y + " " + data.px + " " + data.py);

                // Send it to all other clients
                socket.broadcast.emit('mouse',data);
            }
        );

        // On disconnect
        socket.on('disconnect',function() {

            // Send disconnected message to the console
            console.log("Client has disconnected");

            // Set connected user counter on disconnect
            if ($ipsConnected.hasOwnProperty($ipAddress)) {
                delete $ipsConnected[$ipAddress];
                count--;
                socket.emit('connectedusers',{
                    count: count
                });
            }
        });
    }
);

客户端 HTML(文件 index.html

<!doctype html>
<html>
    <head>
        <Meta charset="UTF-8">
        <title>Draw Sockets Example</title>

        <script type="text/javascript" src="./assets/lib/jquery/js/jquery.min.js"></script>
        <script type="text/javascript" src="./assets/js/socket.io.js"></script>
        <script type="text/javascript" src="./assets/js/p5.min.js"></script>
        <script type="text/javascript" src="./assets/js/sketch.js"></script>

        <style>

            #canvas {
                z-index: 1;
                position: absolute;
                display: block;
                border: none;
                margin: 0;

                overflow: hidden !important;
            }

            #status {
                z-index: 2;
                position: absolute;
                display: block;
                bottom: 17px;
                left: 0;
                right: 0;
                height: 60px;
                margin: 0 20px 0 20px;
                padding: 0 5px 0 0;
                font-family: Gotham,'Helvetica Neue',Helvetica,Arial,'sans-serif';
                font-size: 30px;
                color: black;
                line-height: 130%;
                text-align: left;
            }

        </style>

    </head>
    <body>

        <!-- Status text field,for displaying connection information -->
        <div id="status"></div>

    </body>
</html>

客户端 JavaScript 代码文件 sketch.js

// Keep track of our socket connection
var socket;

function setup() {
    // Create the canvas.
    let canv = createCanvas(window.innerWidth,window.innerHeight);

    // Assign a CSS selector ID to the canvas element
    canv.id('canvas');

    // Start a socket connection to the server
    socket = io.connect('http://192.168.1.100:3000',{ transports : ['websocket'] });

    // Set status
    socket.on('connectedusers',function (data) {
            var status = "Drawing with " + ((data.count)-1) + " other people";
            document.getElementById("status").innerHTML = status;
        }
    );

    // We make a named event called 'mouse' and write an anonymous callback function
    socket.on('mouse',// When we receive data
        function(data) {
            console.log("Got: " + data.x + " " + data.y + " " + data.px + " " + data.py);

            // Draw
            stroke(20);
            strokeWeight(4);
            line(data.x,data.y,data.px,data.py);
        }
    );
}

function draw() {
    // nothing
}

function mouseDragged() {
    // Draw
    stroke(20);
    strokeWeight(4);
    line(mouseX,mouseY,pmouseX,pmouseY);

    // Send the mouse coordinates. x,y,prevIoUs x,prevIoUs y
    sendmouse(mouseX,pmouseY);
}

// Function for sending to the socket
function sendmouse(xpos,ypos,pxpos,pypos) {
    // We are sending!
    console.log("sendmouse: " + xpos + " " + ypos + " " + pxpos + " " + pypos);

    // Make a little object with x and y
    var data = {
        x: xpos,y: ypos,px: pxpos,py: pypos
    };

    // Send that object to the socket
    socket.emit('mouse',data);
}


// Window resize
function windowResized() {
    resizeCanvas(window.innerWidth,window.innerHeight);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?