繁体   English   中英

socket.io发送消息两次

[英]socket.io send message twice

我正在尝试在SPA应用程序中创建实时聊天。 我可以进行聊天,但是当我移至另一个页面并返回到聊天页面时,它将开始两次加载消息。 这是我的socket.io服务器端:

var io = require('socket.io').listen(app.listen(config.port));
io.sockets.on('connection', function (socket) {
    socket.emit('message', { message: 'You are chatting now !' });
    socket.on('send', function (data) {
        io.sockets.emit('message', data);
    });

我尝试使用io.sockets.once而不是io.sockets.on,但是它没有第二次显示聊天。

这是我的客户端以及html(玉模板引擎):

#content(style='width: 500px; height: 300px; margin: 0 0 20px 0; border: solid 1px #999; overflow-y: scroll;')
    input#field(style='width:350px;')
    input#send(type='button', value='send')
script(src='/socket.io/socket.io.js')
script.
    $("#field").keyup(function(e) {
        if(e.keyCode == 13) {
            sendMessage();
        }
    });
    var messages = [];
    var socket = io.connect('localhost:3030/#/chat');
    var field = document.getElementById("field");
    var sendButton = document.getElementById("send");
    var content = document.getElementById("content");
        socket.on('message', function (data) {
        if(data.message) {
            messages.push(data.message);
            var html = '';
            for(var i=0; i<messages.length; i++) {
                html +=  messages[i] + '<br />';

            }
            content.innerHTML = html;
            content.scrollTop = content.scrollHeight;
        } else {
            console.log("There is a problem:", data);
        }
    });
        sendButton.onclick = sendMessage = function() {
        var text = field.value;
        socket.emit('send', { message: text });
        field.value = '';
    };

我想修复此问题,因此当我第二次返回时,它不显示2次,或者第三次显示3次,以此类推...非常感谢您的帮助:)

如果我理解正确,则希望在页面刷新之间保持正确的持久性,只需在服务器上添加一个数组以收集消息并告知新的连接。

我真的只是使用文档来实现我的目标(参考链接http://socket.io/docs/server-api/

为了使以下代码运行,有必要在工作目录中执行以下命令

npm install express
npm install socket.io

(服务器代码)

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

//serve up the file, the code for this is below, I translated your jade to html
app.get('/', function(req, res){
  res.sendfile('index.html');
});

//note this will get big eventually with lots of users
var message_past = [];

io.on('connection', function(socket){
  socket.emit('server-message', { message: 'Welcome !' });
  // tell user recent posts
  for (var i = 0; i < 20 && !!message_past[i] ; i ++) socket.emit('user-message',message_past[i]);

  // save the message and update everyone with it
  socket.on('user-message', function (data) {
        message_past.push(data);
        // io.emit will tell everyone <-- I think what you want
        // socket.broadcast.emit will tell everyone but this socket
        // socket.emit will tell just this socket
        io.emit('user-message', data);
  });

});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

和客户端代码

<input id='field' type="text" style='width:350px;'/>
<input id='send' type='button' value='send'/>
<div id='content' style='width: 500px; height: 300px; margin: 0 0 20px 0; border: solid 1px #999; overflow-y: scroll;'>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src='/socket.io/socket.io.js' ></script>
<script type="text/javascript">
    $("#field").keyup(function(e) {
        if(e.keyCode == 13) {
            sendMessage();
        }
    });
    var socket = io.connect('localhost:3000/#/chat');
    console.log(socket)
    var field = document.getElementById("field");
    var sendButton = document.getElementById("send");
    var content = document.getElementById("content");

    var display_message = function( data ) {
        if(data.message) {
            $(content).append(data.message+'<br/>');
            content.scrollTop = content.scrollHeight;
        } else {
            console.log("There is a problem:", data);
        }
    };

   socket.on('server-message', display_message);
   socket.on('user-message', display_message);
   sendButton.onclick = sendMessage = function() {
        var text = field.value;
        socket.emit('user-message', { message: text });
        field.value = '';
    };
</script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM