私人消息的问题

时间:2017-01-23 12:29:13

标签: php node.js socket.io

请注意: 我知道这可能是其他问题的重复,但我希望能帮助我的代码!!

我正在尝试为我的社交网络构建聊天功能..我已经使用了node.js和socket.io ...这段代码的问题在于,消息正在传递给每个连接的用户而不仅仅是目标的to_user ...此代码的来源来自于newboston教程...... 我现在就像这样构建它:

client.php

<div class="chat" hidden>
    <textarea class="chat-name"><?php echo escape($data->username); ?></textarea>
    <div class="chat-messages">
    <?php 
     $chtrndr = $cht->renderchats(escape($data->id));
     foreach ($chtrndr as $chtrndrs) {
       echo '<div>' . $chtrndrs['m_from'] . ': ' . $chtrndrs['m_text'] . '</div><br>';
     }
     ?>
    </div>
    <textarea class="chat-textarea" placeholder="Type your message"></textarea>
    <div class="chat-status">Status:<span>Idle</span></div>
    </div>
    <!-- <script src="/socket.io/socket.io.js"></script> -->
    <script src="http://127.0.0.1:8080/socket.io/socket.io.js"></script>
    <script src="server.js"></script>
    <script>
    (function(){
      var getNode = function(s) {
        return document.querySelector(s);
      },

      //get required nodes
      status = getNode('.chat-status span'),
      messages = getNode('.chat-messages'),
      textarea = getNode('.chat-textarea'),
      chatName = getNode('.chat-name'),
      statusDefault = status.textContent,

      setStatus = function(s) {
        status.textContent = s;

        if(s!==statusDefault)
        {
          var delay = setTimeout(function(){
            setStatus(statusDefault);
            clearInterval(delay);
          },3000);
        }
      };

      setStatus('testing');

      try {
        var socket = io.connect('http://127.0.0.1:8080');
      }
      catch(e)
      {
        //set status to warn user
      }

      if(socket!==undefined)
      {
        //listen for output
        socket.on('output',function(data){
          if(data.length)
          {
            //loop through results
            for(var x=0;x<data.length;x=x+1)
            {
              var message = document.createElement('div');

              message.setAttribute('class','chat-message');
              message.textContent = data[x].m_from + ': ' + data[x].m_text;

              //append
              messages.appendChild(message);
              messages.insertBefore(message, messages.firstChild);
            }
          }
        });
        //listen for a status
        socket.on('status',function(data){
          setStatus((typeof data === 'object') ? data.message : data);

          if(data.clear === true)
          {
            textarea.value = '';
          }
        });
        //listen for keydown
      textarea.addEventListener('keydown',function(event){
          var self = this,
            fname = <?php echo escape($_SESSION['user']); ?>,
            tname = <?php echo $data->id; ?>;

          if(event.which === 13 && event.shiftKey === false) {
            socket.emit('input', {m_from:fname, m_to:tname, m_text:self.value});
            event.preventDefault();
          }
        });
      }
    })();
    </script>

这是服务器文件: 的 SERVER.js

var client = require('socket.io').listen(8080).sockets;
var express = require('express');
var app = express();
var mysql  = require('mysql');
var path = require('path');
var dbconn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',
  database : 'test'
});

app.use(express.static(path.resolve(__dirname, './css/')));

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

    dbconn.connect(function(err){
        if(err){
    console.log('Database connection error');
  }else{
    console.log('Database connection successful');
  }
        client.on('connection',function(socket){

          console.log('Data received from Db');

            sendStatus = function(s){
                socket.emit('status',s);
            };

            //wait for input
            socket.on('input',function(data){
                var fname = data.m_from,
                    tname = data.m_to,
                    m_text = data.m_text,
                    whitespacePattern = /^\s*$/;

                if(whitespacePattern.test(m_text))
                {
                    sendStatus('message is required');
                }
                else
                {
                    var record = { m_from: fname, m_to:tname, m_text: m_text };
                    dbconn.query('INSERT INTO messages SET ?', record, function(err,res){
                     if(err) throw err;

                        client.emit('output',[data]);

                        sendStatus({
                            message: "message sent",
                            clear: true
                        });
                    });
                }

            });
        });
    });

我想添加以下功能: *(a)*由于它是一个社交网络,它可以提供私人聊天服务,登录用户... (b)接收者在稍后重新登录后会收到这些消息。

我已经在谷歌搜索了很多页面,并且听说房间是我的首选。但作为nodejs中的菜鸟,idk如何实现房间,使私人消息可能... 如果any1 cud帮我编码,甚至把我放在正确的路径上,我可以学习在node.js中编写代码,并为初学者提供简单的教程,它真的很有帮助! Thanx提前!

1 个答案:

答案 0 :(得分:0)

看起来应该是应用程序中的每个用户都应该唯一ID

<强> LOGIC

1.您必须在 output_userId

上从后端(服务器端)发出事件
  1. 您的frontEnd(客户端)应该在 output_userId
  2. 上收听套接字事件

    这样做会让您从服务器端向特定用户发出消息,并且每个用户都将监听 output_userId ,这是他们的特定ID。其中 userId 是项目的唯一ID。

    示例:

    我们有3个用户 1,2,3

    现在,如果用户1正向用户2发送消息

    你的活动应该像

    服务器端

    Socket.emit(OUTPUT_1)

    客户端

    每个客户端用户都应该收听他们的output_userid

    对于用户1,它应该是output_1

    对于用户2,它应该是output_2

    对于用户3,它应该是output_3