javascript - Socket.io 从接收者的浏览器发出,但不在发送者的浏览器上发出

标签 javascript node.js sockets websocket socket.io

嗨,我对 socket.io 有点陌生,所以不太确定我正在做的事情是否正确/标准,但由于它运行良好,我想它没问题。这个应用程序是聊天应用程序,我编写的脚本能够将消息存储在数据库中并将它们加载到接收者和发送者的浏览器中...问题是除非我刷新页面,否则它不会加载到发送者的页面上,而且我发现了它很奇怪,因为接收器接收数据就很好,无需刷新页面,所以我想“什么给出了?”

这是server.js

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

var validator;
var messages = [];

var sequelize = new Sequelize('schat', 'root', '');

app.use('/assets', require('express').static(__dirname + '/assets'));
app.use('/temp', require('express').static(__dirname + '/temp'));
app.get('/', function(req, res){
  res.send(validator);
});

io.on('connection', function(socket){
  // Send all previously sent messages
  for( i in messages ) {
    socket.emit('chat message', messages[i]);
  }

  socket.on('chat message', function(msg){
    console.log('message: ' + msg);

    // Push the message into the in-memory array.
    messages.push(msg);

    // Storage the message for when the application is restarted.
    sequelize.query('INSERT INTO chat_storage(chat) VALUES("'+msg+'")').success(function() {
      // Insert was successful.
    }).error(function (err) {
      // Error inserting message
    });

    // Send the message to everyone
    socket.broadcast.emit('chat message', msg);
  });
});

function getStdout(command, args, fn) {
  var childProcess = require('child_process').spawn(command, args);
  var output = '';
  childProcess.stdout.setEncoding('utf8');
  childProcess.stdout.on('data', function(data) {
    output += data;
  });
  childProcess.on('close', function() {
    fn(output);
  });
}

// Load Messages
sequelize.query('SELECT chat FROM chat_storage ').success(function (rows)  {
  for( i in rows ) {
    messages.push(rows[i].chat);

  }
  getStdout('php', ['message.php'], function(output) {
    validator = output;
    http.listen(3000, function(){
      // Start server.
    });
  });
}).error(function (err) {
  // Error!
});

然后这是加载聊天的页面

<?php startblock('script') ?>

 <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    <script>

 var socket = io();
  $('form').submit(function(){
    socket.emit('chat message', $('#m').val());
    $('#m').val('');
    return false;
  });
  socket.on('chat message', function(msg){
    $('#messages').append($('<li class="bubble">').text(msg));
  });


    </script>


  <?php endblock(); ?>

有什么建议或者我错过了什么吗?我尝试将 socket.broadcast.emit('chat message', msg); 更改为 socket.emit('chat message', msg); 但它不起作用确实会在发送者的浏览器上加载,但不会在接收者上加载,请帮助我

最佳答案

:)

使用以下行在客户端本地添加消息:

$('#messages').append($('li').text($('#m').val()));

或者替换以下内容:

socket.broadcast.emit('chat message', msg);

这样:

io.sockets.emit('chat message', msg);

关于javascript - Socket.io 从接收者的浏览器发出,但不在发送者的浏览器上发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130463/

相关文章:

JavaScript try/catch 和 ajax 报告

Javascript速记

javascript - 根据不同div中的其他表头高度调整表头高度

node.js - 连接表中仅创建了列

python - 在python中获取已连接客户端的IP

javascript - 如何防止 Visual Studio Code 在格式化代码时打断长行?

javascript - 删除另一个数组中数组中的第一个元素

javascript - 一行代码的单元测试

javascript - HTML onclick - 如何访问函数

java - 我怎样才能告诉 java 为 http 请求使用特定的传出 ip 接口(interface)?