一、基础

1、HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接;且只能从客户端主动请求服务端,服务端不能主动通知客户端。

对于实时通信系统(聊天室或监控系统)这样显然是不合理的。传统的方法有:长轮询(客户端每隔很短的时间,都对服务器发出请求,当时间足够小就能实现实时的效果)、长连接(客户端只请求一次,但是服务器会将连接保持,当有数据时就返回结果给客户端)。这两种方式,都对客户端和服务器都造成了大量的性能浪费,于是WebSocket应运而生。WebSocket协议能够让浏览器和服务器全双工实时通信,互相的,服务器也能主动通知客户端。

2、 WebSocket的原理非常的简单:利用HTTP请求产生握手,HTTP头部中含有WebSocket协议的请求,所以握手之后,二者转用TCP协议进行交流。

Socket.IO是业界良心,新手福音。它屏蔽了所有底层细节,让顶层调用非常简单。并且还为不支持WebSocket协议的浏览器,提供了长轮询的透明模拟机制。

二、实现

1、socket.emit(action,arg1,arg2); 表示发送了一个action命令,还有两个数据,在另一端接收时,可以这么写: socket.on('action',function(arg1,arg2){...});

2、io.sockets.emit    信息传输对象为所有 client ; socket.emit 信息传输对象为当前 socket 对应的 client ,各个client socket 相互不影响;

socket.broadcast.emit 信息传输对象为所有 client ,排除当前socket 对应的 client

3、在使用Node的http模块创建服务器同时还要Express应用,因为这个服务器对象需要同时充当Express服务和Socket.io服务。(如下)

var app = require('express')(); //Express服务
var server = require('http').Server(app); //原生Http服务 var io = require('socket.io')(server); //Socket.io服务 io.on('connection', function(socket){ /* 具体操作 */ }); server.listen(3000);当客户端需要连接服务器时,它需要先建立一个握手。io.处理连接事件,socket 处理断开连接事件。在上面代码里,这套握手机制是完全自动的,我们可以通过也可以io.use()方法来设置这一过程。客户端使用js调用socket.io的Client API即可。
<script src="/lib/socket.io/socket.io.js"></script>
<script>var socket = io();socket.on('connect', function() {/* 具体操作 */});
</script>

4、同一个服务器可以使用namespaces创造不同的Socket连接。Socket.IO使用of()来指定不同的命名空间。

io.of('/someNamespace').on('connection', function(socket){socket.on('customEvent', function(customEventData) {/* 具体操作 */});
});
io.of('/someOtherNamespace').on('connection', function(socket){socket.on('customEvent', function(customEventData) {/* 具体操作 */});
});

  服务器端则通过在定义Socket对象时传递namespace参数。

<script>var someSocket = io('/someNamespace');someSocket.on('customEvent', function(customEventData) {/* 具体操作 */});var someOtherSocket = io('/someOtherNamespace');someOtherSocket.on('customEvent', function(customEventData) {/* 具体操作 */});
</script>

  在每一个namespace中又可以使用room来进一步划分,不过sockets是使用join()、leave()来调用。

//服务器端
io.on('event', function(eventData){//监听join事件socket.on('join', function(roomData){socket.join(roomData.roomName);});//监听leave事件socket.on('leave', function(roomData){socket.leave(roomData.roomName);});
});
//浏览器端
io.on('connection', function(socket){//在此room下触发事件io. in('someRoom') .emit('customEvent', customEventData);
});

  参考:http://www.cnblogs.com/edwardstudy/p/4358202.html

 

转载于:https://www.cnblogs.com/george93/p/7513334.html

WebSocket和WebRtc的一些心得相关推荐

  1. websocket autobahn webrtc

    最近分析webrtc android 的交互流程(房间服务器.信令.穿透等),发现webrtc是使用的是autohahn 的 websocket,初步看了下发现这个库封装的很不错,就分享出来,下面的 ...

  2. 第二期分享 | WebSocket+MSE——HTML5直播技术解析

    分享 | 刘博(又拍云多媒体开发工程师) 又小拍: 如何实现HTML5直播技术是直播创业团队一直想要攻克的难题.12月1日20:00,深度参与"又拍直播云"开发的工程师刘博就如何利 ...

  3. PeerJS 0.1.7:一个用于浏览器内P2P的WebRTC封装器

    Michelle Bu与Eric Zhang在3月6日发布了PeerJS 0.1.7,它封装了WebRTC.后者是W3C倡议的旨在促进浏览器内P2P通信的一种技术. 尽管WebSocket的作用发展迅 ...

  4. WebRTC系列<四> 全面了解客户端-服务器网页游戏的WebRTC

    转载:https://blog.brkho.com/2017/03/15/dive-into-client-server-web-games-webrtc/ 多人游戏很有趣.对于他们在单人沉浸感方面所 ...

  5. HTML5 直播协议之 WebSocket 和 MSE

    原文出处:直播社区 当前为了满足比较火热的移动 Web 端直播需求, 一系列的 HTML5 直播技术迅速的发展了起来. 常见的可用于 HTML5 的直播技术有 HLS, WebSocket 与 Web ...

  6. 简单搭建webrtc

    webrtc 网页点对点demo搭建 1.前言 "它(WebRTC)允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或) ...

  7. uni-app webrtc 实现H5音视频通讯

    文章目录 1. 写在前面 2. 项目需求 (安全帽视频对接) 2.1 完成效果 3. 开始搞,uni-app 开发H5视频对接 3.1 html代码 3.2 js 代码(核心步骤) 3.2.1 根据接 ...

  8. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(2月27日-3月4日)

    分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(2月27日-3月4日) 本周Silverlight学习资源更新 Silverlight实用窍门系列:57.Sil ...

  9. Linux C++性能优化秘籍:从编译器到代码,探究高性能C++程序的实现之道

    Linux C++性能优化秘籍:从编译器到代码,揭秘高性能C++程序的实现之道 引言 性能优化的重要性 Linux环境下C++程序的特点 高性能C++编程的核心要点 编译器优化 GCC与Clang编译 ...

最新文章

  1. c语言界面怎么加图形,「分享」C语言如何编写图形界面
  2. JavaScript初体验之冲出迷雾,我四个多小时的经验教训_AX
  3. 表单input中disabled提交后得不到值的解决办法
  4. 每天一道LeetCode-----找到所有被某个字符包围的另一个字符
  5. php数组格式化显示,php 打印数组格式化显示
  6. 软件项目送上门来了,还要学会说不,接了项目拿了定金噩梦才刚刚开始
  7. 【dfs】【拓扑排序】组合树
  8. 比雷蛇0day更严重:通过虚拟赛睿外设即获取 Windows 管理员权限
  9. [转注自官网]Cocos2d-x Tutorial 4 - 如何放出子弹(Glede Edition for 2.0.3)
  10. linux删除链接和连接对象,linux 链接的使用 创建和删除符号连接(软、硬链接)...
  11. android javamail获取邮件太多太慢_「Java」 - SpringBoot amp; 邮件发送
  12. 解决word错误提示宏错误提示和模板错误提示
  13. java菜鸟教程100_JAVA/JSP学习系列之一
  14. 新版C语言面试题面试题库(含答案)
  15. 工业人工智能及应用研究现状及展望
  16. layDate 时间范围限制 开始时间小于结束时间
  17. linux iscsi 发起程序,设置iSCSI的发起程序(客户端)(三)
  18. CAN位时序及相关参数解读
  19. 华为云服务器使用教程
  20. 一文读懂数据中台技术架构

热门文章

  1. 用Android Studio做一个超好玩的拼图游戏,附送超详细注释的源码
  2. java家谱树_青锋家谱系统-基于springboot+orgtree的青锋家谱树管理系统
  3. php mongodb _id,mongodb php findone()由ID
  4. php能做什么程序,PHP 能做什么?
  5. java 打印gc_java – 以编程方式打印启用GC日志记录时通常在JVM出口上打印的堆使用情况...
  6. android activity启动模式_Android知识点【Activity】清单文件
  7. python 识别图形验证码_python爬虫20 | 小帅b教你如何用python识别图片验证码
  8. lua能在stm32arm上运行吗_IOS App能在Mac运行!苹果这黑科技能撼动微软吗?
  9. java捕捉sql执行异常_如何捕获java.sql.SQLIntegrityConstraintViolationException?
  10. mysql -e -f_twitter-不正确的字符串值:'\ xF0 \ x9F \ x8E \ xB6 \ xF0 \ x9F ...'MySQL