2016-02-11 2 views
0

Я пытаюсь создать чат-систему, где пользователь может отправлять сообщения всем (и это сообщение отображается в div с id «chat»), и я эта функция была достигнута. Теперь я хотел бы реализовать частный чат. Пользователь может щелкнуть по имени другого пользователя в правом столбце (который показывает всех зарегистрированных пользователей), как только он щелкнет по имени пользователя, появится небольшое окно (div с классом «chatpopup»), и в этом окне есть кнопка отправки и введите текст, который будет заполнен сообщением, после нажатия кнопки отправки сообщение должно быть отправлено другому пользователю.частный чат с socket.io в node.js

Это то, что у меня есть, если я нажму на пользователя (в правой части экрана), появится маленькое окно (chatpopup), но когда я попытаюсь отправить форму внутри этого маленького окна, приложение выйдет из строя. Я также хотел бы получить некоторые подсказки о создании частного чата, например, как я могу открыть новое окно (с приемом сообщения) на стороне клиента, которое должно получить сообщение?

index.html

<html> 
<head> 
    <title>Chat with socket.io and node.js</title> 
    <style> 
     #contentWrap 
     { 
      width:100%; 
      display: none; 
     } 
     #chatWrap {float: left; width:80%;} 
     #chat 
     { 
      height:500px; 
      width:96%; 
      border: 1px #000 solid; 
      padding-left:2%; 
      padding-right:2%; 
     } 
     #users 
     { 
      margin-left:82%; width:15%; 
      height:500px; 
      border: 1px #000 solid; 
      text-align:right; 
     } 
     #send-message {margin-top:3%; width:100%;} 
     #message {width:80%;} 
     .err1r{ padding-top:1%; 
      color: red; 
     } 
     .whisper{ 
      color: gray; 
      font-style: italic; 
     } 
     p.sideusername:nth-child(even) {background-color:#FAFAFA; padding-bottom:5%; padding-top:5%;} 
     p.sideusername:nth-child(odd) {background-color: #f5f5f0; padding-bottom:5%; padding-top:5%;} 
     .chatpopup {width:350px; height: 250px; background-color:blue;} 
     #interlocutore {background-color:red; height: 30px; text-align: left;} 
     #msgspace {height:150px; background-color:yellow;} 
    </style> 
</head> 
<body> 
    <div id="nickWrap"> 
     <p>Enter a username:</p> 
     <p id="nickError"></p> 
     <form id="setNick"> 
      <input size="35" id="nickname"></input> 
      <input type="submit"></input> 
     </form> 
    </div> 

    <div id="contentWrap"> 
     <div id="chatWrap"> 
      <div id="chat"></div> 
      <form id="send-message"> 
       <input size="35" id="message"></input> 
       <input type="submit"></input> 
      </form> 

     </div> 
     <div id="users"></div> 
    </div> 


    <script src="http://code.jquery.com/jquery-latest.min.js"></script> 
    <script src="/socket.io/socket.io.js"></script> 
    <script> 
     jQuery(function($){ 
      var socket = io.connect(); 
      var $nickForm = $('#setNick'); 
      var $nickError = $('#nickError'); 
      var $nickBox = $('#nickname'); 
      var $users = $('#users'); 
      var $messageForm = $('#send-message'); 
      var $messageFormPopup = $('#send-message-popup'); 
      var $messageBox = $('#message'); 
      var $messageBoxPopup = $('#messagePopup'); 
      var $chat = $('#chat'); 

      $nickForm.submit(function(e){ 
       e.preventDefault(); 
       socket.emit('new user', $nickBox.val(), function(data){ 
        if(data){ 
         $('#nickWrap').hide(); 
         $('#contentWrap').show(); 
        } else{ 
         $nickError.html('That username is already taken! Try again.'); 
        } 
       }); 
       $nickBox.val(''); 
      }); 

      socket.on('usernames', function(data){ 
       $users.empty(); 
       for(var i=0; i < data.length; i++){ 
        $users.append('<p class="sideusername">' + data[i] + "</p>"); 
       } 
      }); 

      $messageForm.submit(function(e) 
      { 
       e.preventDefault(); 
       socket.emit('send message', $messageBox.val(), function(data) 
       { 
       }); 
       $chat.append('<span class="error">' + data + "</span><br/>"); 
       $messageBox.val(''); 
      }); 

      $messageFormPopup.submit(function(e) 
      { 
       e.preventDefault(); 
       socket.emit('send popup message', $messageBoxPopup.val(), function(dataPopup) 
       { 

       }); 
       $messageBoxPopup.val(''); 
      }); 

      socket.on('load old msgs', function(docs){ 
       for(var i=docs.length-1; i >= 0; i--){ 
        displayMsg(docs[i]); 
       } 
      }); 

      socket.on('new message', function(data){ 
       displayMsg(data); 
      }); 

      function displayMsg(data){ 
       $chat.append('<span class="msg"><b>' + data.nick + ': </b>' + data.msg + "</span><br/>"); 
      } 

      socket.on('whisper', function(data){ 
       $chat.append('<span class="whisper"><b>' + data.nick + ': </b>' + data.msg + "</span><br/>"); 
      }); 

      $(document).on("click", ".closepopup", function() { 
       $(this).parents('.chatpopup').hide(); 
      }); 

      $(document).on("click", ".sideusername", function() 
      { 
       var interlocutore = $(this).text(); 
       $chat.append('<div class="chatpopup"><table><tr><td id="interlocutore"></td><td><p class="closepopup">X</p></td></tr><tr><td colspan="2" id="msgspace"></td></tr><tr><td colspan="2"><form id="send-message-popup"> <input size="35" id="messagePopup"></input><input type="submit"></input></form></td></tr></table></div>'); 
       $('#interlocutore').append(interlocutore); 
      }); 

     }); 
    </script> 
</body> 
</html> 

app.js

var express = require('express'), 
    app = express(), 

server = require('http').createServer(app), 
io = require('socket.io').listen(server), 
mongoose = require('mongoose'), 
users = {}; 
server.listen(3000); 

    mongoose.connect('mongodb://localhost/chat', function(err) 
    { 
     if(err) 
      console.log(err); 
     else console.log('Connected to mongodb!'); 
    }); 

    var chatSchema = mongoose.Schema(
    { 
     nick: String, 
     msg: String, 
     created: {type: Date, default: Date.now} 
    }); 

    var Chat = mongoose.model('Message', chatSchema); 
    app.get('/', function(req, res) 
    { 
     res.sendfile(__dirname + '/index.html'); 
    }); 

    io.sockets.on('connection', function(socket) 
    { 
     var query = Chat.find({}); 
     query.sort('-created').limit(8).exec(function(err, docs) 
     { // carico gli ultimi 8 messaggi in ordine di data 
      if(err) throw err; 
      socket.emit('load old msgs', docs); 
     }); 

     socket.on('new user', function(data, callback) 
     { 
      if (data in users) 
       callback(false); 
      else 
      { 
       callback(true); 
       socket.nickname = data; 
       users[socket.nickname] = socket; 
       updateNicknames(); 
      } 
     }); 


     function updateNicknames() 
     { 
      io.sockets.emit('usernames', Object.keys(users)); 
     } 

     socket.on('send message', function(data, callback) 
     { 
       var msg = data.trim(); 
       var newMsg = new Chat({msg: msg, nick: socket.nickname}); 
       newMsg.save(function(err) 
       { 
        if(err) throw err; 
        io.sockets.emit('new message', {msg: msg, nick: socket.nickname}); 
       }); 

       socket.on('disconnect', function(data) 
       { 
        if(!socket.nickname) return; 
        delete users[socket.nickname]; 
        updateNicknames(); 
       }); 
     }); 


     socket.on('send popup message', function(data, callback) 
     { 
      /*var msgPopup = dataPopup.trim(); 
      if (msgPopup !== "") 
       users[interlocutore].emit('whisper', {msg: msgPopup, nick: socket.nickname}); 
      */ 
       var msg = data.trim()+" hello"; 
       var newMsg = new Chat({msg: msg, nick: socket.nickname}); 
       newMsg.save(function(err) 
       { 
        if(err) throw err; 
        io.sockets.emit('new message', {msg: msg, nick: socket.nickname}); 
       }); 
      socket.on('disconnect', function(data) 
      { 
       if(!socket.nickname) return; 
       delete users[socket.nickname]; 
       updateNicknames(); 
      }); 
     }); 
    }); 
+0

какой версия socket.IO вы используете? –

ответ

0

Идея заключается в том, что сервер сохраняет каждый сокет, подключенный к нему по имени пользователя: users[socket.nickname] = socket;

поэтому, когда пользователь посылает сообщение другому пользователю - вы должны отправить событие - отправить ему имя пользователя другого пользователя - взять сокет этого пользователя и выдать ему сообщение:

клиент:

socket.emit('sendPrivate','someusername','message'); 
socket.on('privateMsg',function(from,msg){ 
//write private message from user 'from' 
}); 

сервер:

socket.on('sendPrivate',function(to,msg){ 
    users[to].emit('privateMsg',socket.username,msg); 
}); 
2

Чтобы создать приватный чат с помощью socket.IO, вы должны сначала понять, как номера в Socket.io работы. Вы можете найти множество учебников. Вы также можете получить сообщение this.

Теперь вам нужно расширить эту функциональность, чтобы создать частную чат-систему. Для этого вам нужно иметь уникальный id для каждого клиента, который либо подключен, либо находится в сети. socket.id - это уникальный ключ, который каждый клиент получает от присоединения к чату.

На стороне клиента вы можете испустить имя вместе с сообщением серверу. Вы делаете так, как это:

socket.emit('privateMessage', 'theUserName', message); 

На стороне сервера, вы могли бы управлять массив пользователей, подключенных и сохранить свои уникальные имена пользователей или идентификатор «с.

var connectedClients = {}; 

Таким образом, каждый раз, когда пользователь подключается к чату, (для которых вы, вероятно, используя new user событие), сохранить идентификатор пользователя в connectedClients.

connectedClients[username] = socket.id; 

Где username это имя, которое отправляется на сервер, а пользователь подключается к системе чата.(.. Я надеюсь, что вы знаете, как это сделать, если нет, то спросите меня)

Тогда мы делаем слушатель слушать privateMessage события и испустить на сообщение этого конкретного пользователя, мы делаем:

socket.on('privateMessage', function(to, message) { 
    var id = connectedClients[to]; 
    io.sockets.socket(id).emit('sendPrivateMessage', socket.username, message); 
}); 

Наконец, на стороне клиента ваш слушатель для sendPrivateMessage получает сообщение, и вы можете соответствующим образом обновить свое представление.

Смежные вопросы