【问题标题】:Node.js app receives emit from browser, but browser does not receive emit backNode.js 应用程序从浏览器接收到发射,但浏览器没有收到发射回
【发布时间】:2017-09-25 05:40:44
【问题描述】:

我似乎无法弄清楚为什么 node.js 服务器连接正常,并且从浏览器接收到一个 emit() 正常,但是当我尝试从 node.js 返回它时它没有到达浏览器.我在这里遗漏了什么吗?

控制台日志显示“已收到测试”,但未显示“已发送到浏览器的测试”。

(index.php)sn-p:

<script language="javascript" type="text/javascript">       
        var socket = io.connect('https://www.example.com:2053', {secure: true});
        socket.on('connect', function() {
            socket.emit('join', '19AFA53df7715sfs484');
        });


        socket.on('testsend', function () {
            console.log('Test Sent To Browser');
        });

        $(document).ready(function () {
            $(this).on('click', '.mainlogo', function (e) {
                e.preventDefault();
                socket.emit('testrecieve');
            });
        });

</script>

套接字代码(pipe.js):

var fs = require('fs');

var options = {
    ca: fs.readFileSync(__dirname + '/ca.pem'),
  key: fs.readFileSync(__dirname + '/file.pem'),
  cert: fs.readFileSync(__dirname + '/file.crt')
};

var express = require('express'),
app = express();

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

var https = require('https'),
server = https.createServer(options, app),
io = require('socket.io')(server, { origins: '*:*'});

server.listen(2053);

// routing
app.get('/', function (req, res) {
  res.sendfile('/index.php');
});

io.sockets.on('connection', function (socket) {

    socket.on('join', function(uauth){
        socket.join('messages');
        socket.join(''+uauth+'');
    });

    socket.on('testrecieve', function () {
        socket.broadcast.emit('testsend');
        console.log('Test Recieved');
    });

});

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    问题是socket.broadcast.emit 会将消息发送给除了新创建的连接之外的所有其他客户端。这不是你想要的。你应该改用socket.emit

    【讨论】:

    • 啊,是的,你是对的,而且确实有效。但是我确实需要广播到一个频道,比如这个不行:socket.broadcast.to('messages').emit('testsend');
    • 如果你想广播到房间里的所有socket,包括刚刚连接的socket,你必须使用io.to('messages').emit('testsend');
    • @KevinJ 我对 socket.io 等中的频道不太熟悉,因此建议您查阅一些文档。
    【解决方案2】:

    有错误,是socket.emit,不是socket.broadcast.emit

    socket.on('testrecieve', function () {
        socket.emit('testsend');
        console.log('Test Recieved');
    });
    

    socket.broadcast.emit 将发送给除新连接之外的所有人。

    【讨论】:

    • 你是对的,但是,@giorgi-moniava 比你领先 1 分钟。
    • @KevinJ 公平地说,我认为弗朗索瓦是第一个回答的。但我的回答包含了为什么 broadcast.emit 使用不正确的信息。无论如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2020-07-30
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多