【问题标题】:How to emit message from client side [node.js + socket.io]如何从客户端发出消息 [node.js + socket.io]
【发布时间】:2015-09-13 18:39:39
【问题描述】:

我正在尝试使用 socket.io 从客户端发出消息...

这是我的客户端代码:

var socket = io.connect('http://localhost/');
          socket.on('connect', function(data){
                setStatus('connected');
                socket.emit('subscribe', {channel:'update.comment'});
            });

服务器:

io.sockets.on('connection', function (socket) {
  socket.emit('message', { text : 'Welcome!' });
  socket.on('subscribe', function (data) {
    socket.join(data.channel);
    redisClient.subscribe(data.channel);
  });
});

我在控制台中也收到此错误消息:

获取 http://localhost/socket.io?EIO=3&transport=polling&t=1442169984269-1 404(未找到)

完整的服务器:

var app = require('express')();
var http = require('http').Server(app);
var redis = require('ioredis');
var io = require('socket.io')(http);

redisClient = redis.createClient();

//look for connection errors and log
redisClient.on("error", function (err) {
    console.log("error event - " + redisClient.host + ":" + redisClient.port + " - " + err);
});

io.sockets.on('connection', function (socket) {
  socket.emit('message', { text : 'Welcome!' });
  //on subscription request joins specified room
  //later messages are broadcasted on the rooms
  socket.on('subscribe', function (data) {
    socket.join(data.channel);
    redisClient.subscribe(data.channel);
  });
});

redisClient.on('ready', function(data) {
  console.log('#redis ready');
});

redisClient.on("message", function(channel, message){
    console.log(channel);
    var resp = {'text': message, 'channel':channel};
    io.sockets.in(channel).emit('message', resp);
});

http.listen(3000, function(){
    console.log('Listening on Port 3000');
});

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    发现新问题:

    您的服务器正在侦听端口 3000,但您正尝试连接端口 80。错误消息 http://localhost/socket.io?EIO=3&transport=polling&t=1442169984269-1 上没有端口号,因此默认为端口 80。


    该错误消息意味着您的服务器端 socket.io 代码未正确初始化,因此未侦听启动所有 webSocket 连接的 HTTP 请求,因此当浏览器尝试连接该 URL 以启动 socket.io连接,服务器端没有人在监听,所以网络服务器返回一个 404 错误给浏览器。

    如果您使用 Express,这是将其挂接到服务器的最小 socket.io 初始化:

    var express = require('express');
    var app = express();
    var server = app.listen(8081);
    var io = require('socket.io').listen(server);
    

    对于普通的 HTTP 服务器,这是最小的 socket.io 初始化:

    var app = require('http').createServer(handler)
    var io = require('socket.io')(app);
    app.listen(80);
    

    与往常一样,如果您向我们展示您正在使用的 socket.io 和 Web 服务器初始化代码,我们可以帮助您更好地解决您的特定代码问题。

    【讨论】:

    • @VladimirDjukic - 是的,这是因为当您的浏览器尝试建立 socket.io 连接时,它发现服务器没有侦听 socket.io 用来启动 socket.io 连接的 URL .您的浏览器告诉您没有服务器正在侦听该 URL。您需要在服务器上解决该问题。
    • @VladimirDjukic - 正如您在几天前通过this similar question/answer 看到的那样,您使用的socket.io 初始化序列似乎不起作用,但我建议的那个可以。
    • @VladimirDjukic - 请参阅我在您的代码中看到的关于使用错误端口的答案开头的其他内容。
    猜你喜欢
    • 2015-04-05
    • 2014-01-20
    • 2020-02-01
    • 2012-05-24
    • 2015-04-25
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多