0

我一直在尝试熟悉 socket.io,所以在实时应用程序中使用它。我浏览了一个基本示例,一个聊天室,然后我使用 ngrok 对多个客户端进行了测试,一切都很好。现在我希望使用 TAFFY 保存对话日志,并将其部署到连接到它的新用户,因此我添加了另一个 emmit 来发送该日志,而这个特定的 emmit 似乎永远不会触发on句子在客户端。

这些是服务器说明

    io.on('connection', function(socket){
  console.log("someone connected");

        var chatLog={log:[]};
    log().each(function (iter){ //this is the taffy var
        chatLog.log.push({"usr":iter.usr,"msg":iter.msg});
    });
    var stringLog=JSON.stringify(chatLog);
    console.log(stringLog);
    socket.emit('cargaLog', stringLog);// THIS is the naughty emmit 

  socket.on('chat message', function(msg){
    var mensaje=JSON.parse(msg);
    log.insert({"usr":mensaje.usr,
                  "msg":mensaje.msg
              });
    io.emit('chat message', mensaje.usr.toUpperCase()+" dice: "+mensaje.msg);
  });
});

客户端

    $(function () {
      var socket = io();


      socket.on('cargaLog', function(log){
        alert(log); //this never happens
        console.log(log);
      });


      $('form').submit(function(){
        var mensaje=$('#m').val();
        var json='{"usr":"'+person+'","msg":"'+mensaje+'"}';
        socket.emit('chat message', json);
        $('#m').val('');
        return false;
      });


      socket.on('chat message', function(msg){

        var html='<li><img src="defaultUsrImg.png" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
        $('#messages').append(html);
        window.scrollTo(0, document.body.scrollHeight);
      });


      });

我一直盯着这段代码有一段时间了,与其他人一起工作的解决方案都不适合我(即使用 io.connect() 或 io.connect(' http://0.0.0.0:8080 ') on客户端或来自客户端的 emmit 要求触发服务器 emmit)。

有人知道为什么会这样吗?或者,有人有任何想法可以帮助我更好地解决这个问题吗?

其他详细信息是:运行 windows 10 节点版本 8.2.1 socket.io 版本 2.0.3

我使用节点的方式需要:

var TAFFY = require('taffy');
var express=require('express');
var app = express();
var http = require('http');
var path=require('path');
var port = process.env.PORT || 3000;
var server= http.createServer(app).listen(port);

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

var log=TAFFY({"usr":"SERVER",
                  "msg":"WELCOME"
              });

app.use(express.static(__dirname + '/public'));
app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');

});

客户端 html 代码(只有正文,因为 mt html 包含,它会太长

  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
    <script type="text/javascript" src="./socket.io/socket.io.js"></script>
    <script src="jquery-3.2.1.min.js"></script>
    <!-- <script src="/mensajes.js"></script>  THIS IS THE OLD CODE-->
    <script >
      var person = prompt("Introduce tu nombre o seudonimo", "anon"); //THIS IS THE WORKING CODE

      if(person === null || person===""){
        alert("Necesitas un nombre para participar");
      }
      else{
        $(function () {
          var socket = io();
          socket.emit('ia iege',person);
          socket.on('usrConectado',function(usr){
            var html='<li><h6>'+(usr)+' se ha conectado</h6></li>';
            $('#messages').append(html);
            window.scrollTo(0, document.body.scrollHeight);
          });
          $('form').submit(function(){
            var mensaje=$('#m').val();
            var json='{"usr":"'+person+'","msg":"'+mensaje+'"}';
            socket.emit('chat message', json);
            $('#m').val('');
            return false;
          });
          socket.on('chat message', function(msg){

            var html='<li><img src="https://dujrsrsgsd3nh.cloudfront.net/img/emoticons/419693/pedreiro-1500067445.PNG" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
            $('#messages').append(html);
            window.scrollTo(0, document.body.scrollHeight);
          });
          socket.on('cargaLog', function(log){
            console.log(log);
            var oldLog=JSON.parse(log);
            cargaLog(oldLog);
          });
          });
        function cargaLog(newLog){
            //newLog is an object
            newLog.log.forEach(function(iter){
              var msg=iter.usr.toUpperCase()+' dijo: '+iter.msg;
                 var html='<li><img src="https://dujrsrsgsd3nh.cloudfront.net/img/emoticons/419693/pedreiro-1500067445.PNG" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
            $('#messages').append(html);
            window.scrollTo(0, document.body.scrollHeight);
            });
        }
      }
    </script>
  </body>
4

3 回答 3

0

我将您的代码简化为基础代码,并且我收到的消息很好,您遇到了麻烦。这是可以正常工作的简化代码:

服务器代码:

var express = require('express');
var app = express();
var http = require('http');
var path = require('path');
var port = process.env.PORT || 3000;
var server= http.createServer(app).listen(port);

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

app.get('/', function(req, res){
    res.sendFile(__dirname + '/s1.html');

});

io.on('connection', function(socket) {
    console.log("someone connected");

    var chatLog = {log: [{usr: "someuser", msg: "somemsg"}]};
    var stringLog = JSON.stringify(chatLog);
    console.log(stringLog);
    socket.emit('cargaLog', stringLog); // THIS is the naughty emmit 
});

客户代码:

<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script>
<script>
function dbg(x) {
    let str = x;
    if (typeof x === "object") {
        str = JSON.stringify(x);
    }
    $("#log").append("<div>" + str + "</div>");
}
$(function() {
    var socket = io();


    socket.on('cargaLog', function(log) {
        dbg(log);
    });

});
</script>
</head>
<body>
Empty Content, waiting for message to arrive.
<div id="log"></div>
</body>
</html>

当我加载页面时,浏览器会立即显示您遇到问题的 cargaLog 消息。我建议你回溯到像这样的超级简单的东西,直到你证明它有效,然后一次添加一个东西,直到你找到导致问题的原因。如果此代码对您不起作用,那么您的环境中肯定有一些问题,我可能会重新安装各种组件(socket.io、node.js、express 等)。

于 2017-07-28T17:16:10.740 回答
-1

我认为您可以尝试查看此存储库https://github.com/egin10/socket-chat-example/blob/master/app.jsserver

你可以试试client这个https://github.com/egin10/socket-chat-example/blob/master/chat.html

注意:请记住socket.on(params, callback),它用于从 emmiter 中获取数据,而io.emit(params, obj)on serverside 用于发送数据。

所以,你必须确定你的 emmiting 是什么,server或者client你的 fetching ( socket.on())是什么,server或者client必须有相同params的 。

并且您必须确保您的对象是var chatLog={log:[]};. 如果你想得到log,你必须这样做chatLog.log

这对我来说是工作。我希望它可以帮助你。

于 2017-07-27T22:19:28.007 回答
-1

尝试

socket.emit('chat message' , { usr: person, msg: mensaje});
于 2017-07-27T22:02:04.693 回答