【问题标题】:My socket.io and node.js code won't work - why?我的 socket.io 和 node.js 代码不起作用 - 为什么?
【发布时间】:2020-11-22 11:24:59
【问题描述】:

我一直在关注 TheCodingTrain 的关于 web 套接字和 node.js 的 youtube 教程,我终于完成了它。一切都按预期进行,直到最后。我不知道他的教程现在是过时了还是什么,但由于某种原因,两个浏览器无法连接。谁能告诉我哪里出错了?

链接到第四部分(我卡住的地方)youtube.com/watch?v=i6eP1Lw4gZk

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>
        <script src="https://cdn.socket.io/socket.io-3.0.1.js"></script>

        <meta charset="utf-8" />
    </head>
    <body>
        <script src = "script.js"></script>
    </body>
</html>

script.js

var socket;

function setup() {
    createCanvas(400, 400);
    background(51);

    socket = io.connect('http://localhost:4289');

    socket.on('mouse', newDrawing);
}

function newDrawing() {
    fill(255, 137, 0);
    stroke(255, 0, 0);
    strokeWeight(3);
    ellipse(data.x, data.y, 10, 10);
}

function mouseDragged() {
    console.log('Sending: ' + mouseX + ", " + mouseY);

    var data = {
        x: mouseX,
        y: mouseY
    }

    socket.emit('mouse', data);

    
    fill(0, 0, 255);
    stroke(0, 255, 255);
    strokeWeight(3);
    ellipse(data.x, data.y, 10, 10);
}

server.js

var express = require('express');

var app = express();
var server = app.listen(4289);

app.use(express.static('public'));

console.log("My socket server is up and running!");

var socket = require('socket.io');

var io = socket(server);

io.sockets.on('connection', newConnection);

function newConnection(socket) {
    console.log('New connection at ' + socket.id);

    socket.on('mouse', mouseMsg);

    function mouseMsg(data) {
        socket.broadcast.emit('mouse', data);
        console.log(data);
    }
}

我几乎可以肯定我按照他关于如何正确设置文件的第一部分进行了操作,因为在第四部分之前一切正常。您可能还想按照他的第一部分和第二部分下载节点和套接字。谢谢!

【问题讨论】:

    标签: javascript node.js sockets websocket


    【解决方案1】:

    socket.broadcast.emit(...) 发送到所有连接的套接字,socket 除外。因此,它不会发回您正在回复的消息的发起者。因此,如果您连接了多个客户端,其他客户端就会看到这些消息。

    如果您打算将其发送回原始客户端,请使用:

    socket.emit(...);
    

    如果您打算发送到顶级命名空间上的所有已连接套接字,请执行以下操作:

    io.emit(...);
    

    【讨论】:

    • 这是否意味着我之前的代码只是广播到我原来的标签——基本上是一封“反弹”的电子邮件?因为它不会显示在任何其他窗口上。
    • @TheCodedMasterCubing - 我在回答中描述了socket.broadcast.emit(...)socket.emit(...)io.emit(...) 三个选项的作用。我不确定你不明白其中的哪一部分。
    • @TheCodedMasterCubing - 你可能会发现这个socket.io emit cheatsheet 也很有用。
    • 谢谢,我会努力解决的——但要确保:socket.broadcast.emit 发送给除发件人以外的所有人,socket.emit 只发送给发件人,然后 io.发送给所有人?
    • @TheCodedMasterCubing - 是的。
    猜你喜欢
    • 2014-04-28
    • 2014-01-23
    • 2013-08-06
    • 2016-01-23
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多