2017-01-23 53 views
-1

请注意:我知道这可能是其他问题的可能重复,但我想帮助我的代码!私人短信的问题

我正在尝试为我的社交网络构建一个聊天功能..我使用了node.js和socket.io ...此代码的概率是,该消息正在传递给每个连接的用户而不只是有针对性的to_user ......这段代码的来源是thenewboston教程... 我已经建立了它的现在这个样子:

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 
         }); 
        }); 
       } 

      }); 
     }); 
    }); 

我WUD喜欢添加了以下功能: *(一)*由于它是一个社交网络,它shud可发挥私人聊天,betn 2登录用户... (b)的消息shud由接收他在稍后的时间重新登录后收到..

我梳理对谷歌多页ñSO已经和听说客房是我的去。但作为nodejs的noob,idk如何实现房间,使私人消息传递成为可能... 如果any1 cud帮我编码,甚至设置我在正确的路径,frm在哪里我可以学习编码node.js与简单的初学者教程,它wud ba真的gr8的帮助!感谢提前!

+0

javascript是客户端,如果你打算发布或取消本地主机 - 甚至更好的做法 - 学习如何使用PHP来做数据库查询,并使用jQuery等AJAX请求..你可以查看[PDO](http://php.net/manual/en/book.pdo.php) – KDOT

+0

_“帮我编码”_。 SO不是免费的编码服务。除此之外,寻求关于教程或其他非现场资源的提示是关于SO的_off topic_。在这里阅读更多:[我可以问什么问题吗?](http://stackoverflow.com/help/on-topic) –

+0

马格努斯,说帮我编码它并不一定意味着即时通讯问我的代码为我..所有我想要的是援助...我不问任何1代码重新..我已经有代码建立...上面的代码是基于一套教程,这就是所有..即时消息不问的技巧关闭 - 网站主题:) – Vanessa341

回答

0

看它应该像应用程序中每个用户应该有唯一的ID

LOGIC

1.you必须从后端(服务器端)上output_userId发出事件

  1. 您的frontEnd(客户端)应该监听上的套接字事件output_userId

这是什么会做像你从服务器端发出的消息对特定用户和每个用户将在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

+0

tnq fr ur ur ...我的疑问是这样的:我有每个用户获得frm php的唯一用户ID ... Bt,我如何获取它到node.js中,以及如何分配用户ID到相应的聊天吗? – Vanessa341

+0

节点没有什么不同,因为它的socket.io和php中的节点相同。 您可以这样做=>当您的用户从客户端发送消息时,请发送正在发送消息的用户的userId,向其发送消息的消息,已发送的消息并使用它们将数据存储在数据库并向其他用户发送套接字事件,正如我在上面回答 –

+0

所示,因此代码为user2作为接收者的代码如下:socket.emit('msg',output_2_id)?我会从客户端获得output2_id? – Vanessa341