zoukankan      html  css  js  c++  java
  • 【socket.io研究】1.官网的一些相关说明,概述

    socket.io是什么?

    官网的解释是一个实时的,基于事件的通讯框架,可以再各个平台上运行,关注于效率和速度。

    在javascript,ios,android,java中都实现了,可以很好的实现实时的交流沟通,很好用。

    一般是用nodejs作为服务端,但不是说服务端和客户端进行沟通交流,而是说作为一个服务器,接受注册,转发消息,用户可以使用不同的客户端,进行交流沟通,很类似于QQ微信等实时通信工具。

    支持的通信方式:根据浏览器的支持程度,自动选择使用哪种技术进行通信

    WebSocket

    Flash Socket

    AJAX long-polling

    AJAX multipart Stream

    Forever IFrame

    JSONP polling

    copy一点官网的东西:

    如果你不愿意看,那就看如下几行,后面的代码部分不用看了,是具体的解释,文末有原文链接。

    1.使用了Node http servr

    2.使用了Express 3/4

    3.使用了Express framework

    4.根据不同事件执行不同操作

    5.不同的用户在不同的namespace下,可以实现消息隔离。

    6.在客户端网络情况不好的情况下,发送易变(volatile)数据,在网络情况不好或者是客户端处于长连接建立阶段,客户端没连线,服务器丢弃发送失败的数据。

    7.发送和获取消息,确认收到,当客户端收到消息时,会得到回调函数。

    8.广播消息

    9.就像一个跨浏览器的websocket一样使用它

    1.使用了Node http server

    Server (app.js)
    var app = require('http').createServer(handler)
    var io = require('socket.io')(app);
    var fs = require('fs');
    
    app.listen(80);
    
    function handler (req, res) {
      fs.readFile(__dirname + '/index.html',
      function (err, data) {
        if (err) {
          res.writeHead(500);
          return res.end('Error loading index.html');
        }
    
        res.writeHead(200);
        res.end(data);
      });
    }
    
    io.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });
    Client (index.html)
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io('http://localhost');
      socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
      });
    </script>

    2.使用了Express 3/4

    Server (app.js)
    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    
    server.listen(80);
    
    app.get('/', function (req, res) {
      res.sendfile(__dirname + '/index.html');
    });
    
    io.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });
    Client (index.html)
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect('http://localhost');
      socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
      });
    </script>

    3.使用了Express framework

    Server (app.js)
    var app = require('express').createServer();
    var io = require('socket.io')(app);
    
    app.listen(80);
    
    app.get('/', function (req, res) {
      res.sendfile(__dirname + '/index.html');
    });
    
    io.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });
    Client (index.html)
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect('http://localhost');
      socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
      });
    </script>
    3.发送和接收事件(Sending and receiving events)
    不仅仅包含connect,message,disconnect,你可以定义自己的事件。
    Server
    // note, io(<port>) will create a http server for you
    var io = require('socket.io')(80);
    
    io.on('connection', function (socket) {
      io.emit('this', { will: 'be received by everyone'});
    
      socket.on('private message', function (from, msg) {
        console.log('I received a private message by ', from, ' saying ', msg);
      });
    
      socket.on('disconnect', function () {
        io.emit('user disconnected');
      });
    });
    //发送给对应客户端
    socket.emit('message', "this is a test");
    //发送给所有客户端
    io.sockets.emit.('message', "this ia a test");
    //发送给指定socketid客户端
    io.sockets.socket(socketid).emit('message', "for this socket only");
    //发送自定义事件
    socket.emit('my-event', "this is a test");
    //事件接收
    socket.on("enent name", function(data){
      //data为接收到的数据
    });
    4.如果可以控制应用程序发出的所有消息和事件,使用默认的命名空间,如果想利用第三方代码生成代码,或者是与他人分享代码,使用命名空间namespace,可以实现消息的隔离。这也有力于多路复用。
    Server (app.js)
    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' });
      });
    Client (index.html)
    <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>
    5.发送易变(volatile)消息
    因为网络不好等原因,可能需要发送voiatile消息,以防止收不到所有的反馈而造成的一些问题
    Server
    var io = require('socket.io')(80);
    
    io.on('connection', function (socket) {
      var tweets = setInterval(function () {
        getBieberTweet(function (tweet) {
          socket.volatile.emit('bieber tweet', tweet);
        });
      }, 100);
    
      socket.on('disconnect', function () {
        clearInterval(tweets);
      });
    });
    6.在发送和接收数据时使用回调函数,需要将函数作为.send或者是.emit的最后一个参数.
    Server (app.js)
    var io = require('socket.io')(80);
    
    io.on('connection', function (socket) {
      socket.on('ferret', function (name, fn) {
        fn('woot');
      });
    });
    Client (index.html)
    <script>
      var socket = io(); // TIP: io() with no args does auto-discovery
      socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
        socket.emit('ferret', 'tobi', function (data) {
          console.log(data); // data will be 'woot'
        });
      });
    </script>
    7.发送广播消息
    在send或者是emit前加上broadcast就可以了
    Server
    var io = require('socket.io')(80);
    
    io.on('connection', function (socket) {
      socket.broadcast.emit('user connected');
    });
    8.跨浏览器的问题
    设置send发送数据,监听message事件
    Server (app.js)
    var io = require('socket.io')(80);
    
    io.on('connection', function (socket) {
      socket.on('message', function () { });
      socket.on('disconnect', function () { });
    });
    Client (index.html)
    <script>
      var socket = io('http://localhost/');
      socket.on('connect', function () {
        socket.send('hi');
    
        socket.on('message', function (msg) {
          // my msg
        });
      });
    </script>
    9.房间
    相当于为指定的一些客户端提供一个命名空间,所在房间里的广播和通信不会影响房间意外的其他用户。
    //加入房间
    io.on('connection', function(socket){
      socket.join('some room');
    });
    //离开房间
    socket.leave('some room');
    //向房间中发送信息
    io.to('some room').emit('some event');
    //在某个房间中发送信息
    io.to('spme room').emit('some event');
    //to()方法用于在指定的房间中,对除了当前socket的其他的socket发送消息
    socket.broadcast.to('game').emit('message', 'nice game');
    //in()方法用于在指定的房间中,为房间中的所有的socket发送消息
    io.socket.in('game').emit('message', 'cool game');

    //向my room广播一个事件,提交者会被排除在外(即不会收到消息)
    io.sockets.on('connection', function (socket) {
        //注意:和下面对比,这里是从客户端的角度来提交事件
        socket.broadcast.to('my room').emit('event_name', data);
    }

    //向another room广播一个事件,在此房间所有客户端都会收到消息
    //注意:和上面对比,这里是从服务器的角度来提交事件
    io.sockets.in('another room').emit('event_name', data);

    //向所有客户端广播
    io.sockets.emit('event_name', data);

    //获取所有房间的信息
    //key为房间名,value为房间名对应的socket ID数组
    io.sockets.manager.rooms

    //获取particular room中的客户端,返回所有在此房间的socket实例
    io.sockets.clients('particular room')

    //通过socket.id来获取此socket进入的房间信息
    io.sockets.manager.roomClients[socket.id]

    有些东西解释的不好,请通过文末的原文链接进入原文查看。
    原文:http://socket.io/docs/
    参考:http://blog.csdn.net/baby97/article/details/49385259
    参考:http://www.cnblogs.com/shijiaqi1066/p/3826251.html
  • 相关阅读:
    连Action Bar都不会 你能说你学过 Android?
    Java设计模式 —— 单例模式
    删库跑路 + 比特币勒索?我的MySQL被黑客攻破了
    微信小程序 带参二维码 纯Java实现
    【个人简介】关于博主&阅读指南
    微信小程序 获取 手机验证码 短信验证码 后端功能实现解析
    Handler processing failed; nested exception is java.lang.NoSuchMethodError:
    腾讯云服务器备案全流程 40天备案的血与泪
    [总结]2020年2月 OI学习/刷题记录
    [Luogu P5680][GZOI2017]共享单车
  • 原文地址:https://www.cnblogs.com/renyuzhuo/p/5038502.html
Copyright © 2011-2022 走看看