【问题标题】:Node.js, express and socket.io : socket.on doesn't receive message socket.emit from the server to the clientNode.js、express 和 socket.io:socket.on 没有从服务器接收到消息 socket.emit 到客户端
【发布时间】:2015-10-31 02:23:23
【问题描述】:

此功能在我的应用程序中不起作用。 我无法接收消息 (socket.emit) 从服务器到客户端 (socket.on)。 但我在逆向(客户端到服务器)没有这个问题。

我使用 cloud9,他们的聊天示例运行良好。 这是我的服务器代码:

var http = require('http');
var path = require('path');
var async = require('async');
var socketio = require('socket.io');
var express = require('express');

var router = express();
var server = http.createServer(router);
var io = socketio.listen(server);
router.use(express.static(path.resolve(__dirname, 'client2')));


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

  socket.emit('hello', 'i changed');  // !!!

});


server.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){
  var addr = server.address();
  console.log("Chat server listening at", addr.address + ":" + addr.port);
});

以及html页面的代码:

<html>
  <head>
    <title>test</title>

 <script src="/socket.io/socket.io.js"></script>
  <script>

  var socket = io.connect();

  socket.on('hello', function (msg) {     // !!!
        document.innerHTML = msg;
   });


    </script>
  </head>
  <body>

  <p>normal page</p>

   </body>
</html>

而且没有任何变化... 编辑:使用 console.log 。 但是消息似乎是通过套接字发送的:

Debugger listening on port 15454                                                                                                                                                                                                       
   info  - socket.io started                                                                                                                                                                                                           
Chat server listening at 0.0.0.0:8080                                                                                                                                                                                                  
   debug - served static content /socket.io.js                                                                                                                                                                                         
   debug - client authorized                                                                                                                                                                                                           
   info  - handshake authorized 13XpSYGuXzMpMeyFsRfO                                                                                                                                                                                   
   debug - setting request GET /socket.io/1/websocket/13XpSYGuXzMpMeyFsRfO                                                                                                                                                             
   debug - set heartbeat interval for client 13XpSYGuXzMpMeyFsRfO                                                                                                                                                                      
   debug - client authorized for                                                                                                                                                                                                       
   debug - websocket writing 1::                                                                                                                                                                                                       
   debug - websocket writing 5:::{"name":"hello","args":["i changed"]}  

你能帮帮我吗?

【问题讨论】:

  • 您是否尝试过从 document.innerHTML 更改为 console.log()?可能正在接收数据但未正确添加到页面。
  • 是的,我试过了,也没用。
  • 我认为在客户端上您可能必须手动指定端口(http 为 80),否则它将尝试访问http://&lt;workspace-name&gt;-&lt;username&gt;.c9.io:8080。你看看有没有帮助?
  • 它不起作用。我尝试在代码中将端口更改为 8080: server.listen(8080, process.env.IP || "0.0.0.0", function(){ 然后是 8081 和 8082,要访问网页,我必须使用你的url http://-.c9.io:8081 等。如何手动指定端口 80 ?它与 url ?这很奇怪,因为它是我尝试使用的一个简单功能(发出) 它在我使用 Cloud9 的聊天示例之前甚至在我使用时都对我有用。所以我不知道出了什么问题。

标签: node.js express socket.io


【解决方案1】:

你需要改变

var socket = io.connect();

var socket = io.connect('http://0.0.0.0:8080');

【讨论】:

  • 不,它仍然不起作用,而且更糟。通过此更改,我无法从客户端发送到服务器。
  • 你用的是什么socket.io版本?
  • "version": "0.9.17" 一周前创建项目时Cloud9自动安装的。你们可以尝试复制粘贴我的代码,看看这是否适用于您和您的 Cloud9 项目?这是我正在尝试运行的一个简单函数。
  • 是否可以给你的 git 存储库的链接?
  • 对不起,我没有。
【解决方案2】:

var socket = io.connect()

【讨论】:

    【解决方案3】:

    所以我在这方面做了很多工作,试图让它工作,它有点像,但我不像你那样工作,我是一个初学者,与你的编码方式不兼容,但我发现问题是 io 正在使用的端口

    var io = socketio.listen(server);
    

    或 html 获取连接的位置

    <script src="/socket.io/socket.io.js"></script>
    

    对我来说,html 正在它自己的目录中请求一个 js 文件,但它不应该。

    当我使用 socket.io 时,我把它放在服务器中

    var client = require("socket.io").listen(8080).sockets
    

    主要部分是监听,它在端口 8080 上进行监听,并且在我的 html 中进行监听

    var socket = io.connect("http://127.0.0.1:8080");
    

    这行得通,我很抱歉,我很确定这不是一个答案,但我已经尝试过了,我希望你能完成它,即使已经过去了一年零三个月。

    【讨论】:

      【解决方案4】:
          $(function(){
        var socket = io();
        socket.on('hello',function(data){
          $('#lblmsg').text(data.message);
        });
      });
      

      这是我正在使用的东西。在我的代码的第 4 行中,传递了数据并检索了 data.message。但是您在 html 页面上直接将 msg 与 innerhtml 等同起来(在您评论的块中 \!!!)

      看看你是否还在努力!

      【讨论】:

        猜你喜欢
        • 2017-12-22
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        相关资源
        最近更新 更多