2014-02-19 4 views
0

Я пытаюсь создать чат-систему. Вот он: enter image description hereБраузеры не обновляются, когда сокеты получаются emmited

В верхнем поле указано имя пользователя, а нижнее текстовое поле принимает сообщение. Когда пользователь нажат, введите среднюю текстовую область (которая отключена) обновляет себя новой записью. Это делается с помощью nodejs сокетов. Моя проблема в том, что если я открою еще один экземпляр google chrome, и я напечатаю что-то другое, то хард textorea Google Chrome не обновится. Я озадачен этим, так как мой код должен охватывать этот случай:

Вот код server.js, который обрабатывает вставку. После того, как он вставляет его, он выдает сокет с последней вставкой, чтобы index.html мог обновить себя.

io.sockets.on("connection",function(socket){ 
socket.on("send",function(data){ 

    mongodb.connect("mongodb://127.0.0.1:27017/myDatabase",function(err,db){ 
     if(err) throw err; 
     var to_be_inserted = {name: data.name,content: data.content}; 
     db.collection("chat").insert(to_be_inserted,function(err,objects){ 
      if(err) throw err; 

      var cursor = db.collection("chat").find().sort({_id: -1}).limit(1); 

      cursor.toArray(function(err,docs){ 
       console.log("abc"); 
       socket.emit("data_to_be_printed",docs); 
      }); 

     }); 
    }) 
}) 

})

Как можно видеть, как только данные вставляются сокет испускается, содержащий последнюю строку БД. Index.html должен обрабатывать этот сокет, обновляя его. Вот код, который обрабатывает его:

  <script> 
      var socket = io.connect("127.0.0.1:1337"); 


      socket.on("data_to_be_printed",function(cursor){ 

       var completed = document.getElementById("chatArea").value; 
       for(var i=0; i < cursor.length; i++) 
       { 
        console.log(cursor[i].name + " wrote: " + cursor[i].content); 
        var name = cursor[i].name; 
        var content = cursor[i].content; 
        var name_to_go = name.replace("/\r?\n|\r/g",""); 
        var content_to_go = content.replace("/\r?\n|\r/g",""); 
        completed+="\n" + name_to_go + ": " + content_to_go; 



       } 

       document.getElementById("chatArea").value = completed; 

      }); 

       function keyfunction(e) 
       { 

        if((e.keyCode == 13 || e.which == 13) && !e.shiftKey) 
        { 
         socketEmitDb(); 

        } 

       } 

       function socketEmitDb() 
       { 
        var name = document.getElementById("name").value; 
        var content = document.getElementById("writtenThing").value; 
        console.log("Name: " + name + " |||| content: " + content); 

        document.getElementById("name").value=""; 
        document.getElementById("writtenThing").value=""; 
        if(name.length > 0 && content.length > 0) 
        { 

         socket.emit("send",{"name": name,"content": content}); 

        }else 
        { 
         alert("Make sure that the name and the message is not empty"); 
        } 

       } 

     </script> 

Должен ли розетка быть выпущена во все открытые розетки?

ответ

2

В вашей программе на сервере socket.emit - io.sockets.emit.

socket.emit отправит сообщение конкретному сокету (клиенту), который подключен. io.sockets.emit отправит сообщение всем подключенным сокетам (клиентам)

+0

так что сокет, который исходит из аргумента обратного вызова, - это просто сокет, который только что подключен? – Bula

+0

это правильно. – vinayr