socket.io

客戶端使用

引入socket.io客戶端的js

 <script src="./js/socket.io-client/dist/socket.io.js"></script>
        <script type="text/javascript">
          var newssocket=io.connect("http://localhost:3000/newslist") //連接服務(wù)器下的某個(gè)命名空間
          //向服務(wù)器發(fā)送news事件
          newssocket.emit("news","name",function(data){ //發(fā)送數(shù)據(jù)時(shí),需要回調(diào)函數(shù)(當(dāng)異步獲取數(shù)據(jù)事)
            console.log(data)
            newssocket.emit("newlist",{my:"data"}) //向服務(wù)器發(fā)送數(shù)據(jù)
          })
          
          //監(jiān)聽服務(wù)器端hi事件
          newssocket.on("hi",function(data){
           console.log(data)
          })
          
        </script>

服務(wù)器使用

var app = require('express')();
var News=require("../routes/news")
var http = require('http');
var socketIo=require("socket.io");
app.set("port",3000)
var server=http.createServer(app)
var io=socketIo.listen(server); //監(jiān)聽服務(wù)器端口
io.of("/newslist").on("connection",function(socket){ //
    new News(socket,io)
    socket.on("disconnect",function(){
     io.emit("user disconneted")
   })
 })
class News{
    constructor(socket,io){
      this.socket=socket;
      this.io=io;
      this.onmonitorNewList();
      this.onRecieveClient();
    }
    
    /**
     * 監(jiān)聽客戶端信息
     */
    onRecieveClient(){
        var that=this;
       this.socket.on("newlist",function(data){
         console.log(data)
       })
       this.socket.on("news",function(name,fn){ //
        console.log(name) 
        that.getNewList(fn)
      }) 
    }
   
    /**
     * 
     * @param {客戶端回調(diào)函數(shù)} fn 
     */
    getNewList(fn){
        var data={
            name:"張三",
            value:""
        }
        fn(data)
     }
}
module.exports=News

socket.io使用方式總結(jié)

一 on 和emit事件

on 監(jiān)聽事件
emit 發(fā)送事件
var io=require("socket.io").listen(80)
io.on("connnetion",function(socket){
 socket.on("news",function(data){ //監(jiān)聽服務(wù)器端的news事件
   console.log(data)
   socket.emit("hello","張三") //向服務(wù)器發(fā)送hello事件 值為張三
 }) 
})
var io=require("socket.io").listen(80)
io.on("connnetion",function(socket){
  socket.on("hello",function(data){  //監(jiān)聽客戶端發(fā)送的hello事件
    console.log(data) //data值為張三
    socket.emit("news","newlist")
 })
})

二 發(fā)送和獲取數(shù)據(jù)(回調(diào)函數(shù))

監(jiān)聽事件(發(fā)送數(shù)據(jù))--服務(wù)器端

var io=require("socket.io").listen(80)
io.on("connnetion",function(socket){
  socket.on("news",function(name,fn){  //第一個(gè)為參數(shù) 第二個(gè)位獲取數(shù)據(jù)后的回調(diào)函數(shù)
    fn("newlist")
 })
})

發(fā)送函數(shù)事件(獲取數(shù)據(jù))---客戶端

 socket.emit("news","params",function(data){
 console.log(data) //data的值為newlist
})

三 限制命名空間

如果您可以控制為特定應(yīng)用程序發(fā)出的所有消息和事件,則使用默認(rèn)/命名空間。 如果您想利用第三方代碼或生成與其他人共享的代碼,socket.io提供了一種命名空間套接字的方法。

這具有多路復(fù)用單個(gè)連接的優(yōu)點(diǎn)。 而不是使用兩個(gè)WebSocket連接的socket.io,它將使用一個(gè)。
客戶端

<script>
  var chat = io.connect('http://localhost/chat')
    , news = io.connect('http://localhost/news');
  
  chat.on('connect', function () {
    chat.emit('hi!');
  });
  
  news.on('news', function () {
    news.emit('woot');
  });
</script>

服務(wù)器端

var io = require('socket.io')(80);
var chat = io
  .of('/chat')
  .on('connection', function (socket) {
    socket.emit('a message', {
        that: 'only'
      , '/chat': 'will get'
    });
    chat.emit('a message', {
        everyone: 'in'
      , '/chat': 'will get'
    });
  });

var news = io
  .of('/news')
  .on('connection', function (socket) {
    socket.emit('item', { news: 'item' });
  });

四: 發(fā)送廣播

要進(jìn)行廣播,只需添加廣播標(biāo)志即可發(fā)出和發(fā)送方法調(diào)用。 廣播意味著向除了啟動(dòng)它的套接字之外的所有人發(fā)送消息。

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
});

五Socket.io 的發(fā)送對(duì)象范圍

1 向當(dāng)前客戶端發(fā)送事件

socket.emit('login', {      numUsers: numUsers    });

2 廣播(不包含當(dāng)前客戶端)

socket.broadcast.emit('new message', {  username: socket.username,  message: data});

3 廣播(且包含當(dāng)前客戶端)

io.sockets.emit('message', "this is a test");

4 在房間廣播(不包含當(dāng)前客戶端)

socket.broadcast.to('game').emit('message', 'nice game');

5 在房間廣播(包含當(dāng)前客戶端)

io.sockets.in('game').emit('message', 'cool game');

6 發(fā)送給指定客戶端

io.sockets.sockets[socketid].emit('message', 'for your eyes only');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 經(jīng)歷了比武的風(fēng)波,生活又歸于平靜,每天都重復(fù)著昨天的故事,于是有了過了星期三,翻過一座山,過了星期五還有一上午...
    曉曉石頭閱讀 485評(píng)論 0 1
  • 準(zhǔn)備有序的地醒來 1.提前一晚做準(zhǔn)備。 睡前選好明天穿的衣服,包括配飾和內(nèi)搭。把它們放在固定的地方,這樣的話早晨醒...
    ioodu閱讀 741評(píng)論 0 1
  • plus彭于晏閱讀 150評(píng)論 0 0
  • 睡夢中被嘈雜的說話聲驚醒,一看手機(jī),才四點(diǎn)鐘。怎么回事??? 先生也醒來,說反正醒了,不如去天安門廣場看...
    汾湖秀閱讀 993評(píng)論 10 9

友情鏈接更多精彩內(nèi)容