`
Janne
  • 浏览: 44736 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

WebScock笔记

阅读更多

相关文档:

     http://www.infoq.com/cn/news/2013/12/websocket-and-java/

     http://blog.csdn.net/ricohzhanglong/article/details/17492799

1. WebScock是最新的网络连接技术

2. WebSocket是一个很酷的新技术,可以实现浏览器与服务器之间实时、双向的通信,几乎没有任何额

     外的代价。我这里要做的事情就是提供一个非常简洁,但却内容丰富的概览,介绍如何开始使用这门

     技术。首先读者需要了解如下一些事情

      

  •    ① 首先在浏览器与服务器之间需要开启一个TCP Socket连接,每一方都可以向对方发送消息
  •       (比如说,服务器可以在有数据时将其推送出去,无需使用轮询、长轮询、iframes等技术)。
  •    ② 并不是所有浏览器都支持WebSocket技术,IE 10是首个支持WebSocket的IE版本,Android依然
  •        还存在着一些问题。幸好有SockJS,在不支持WebSocket的情况下,它会退回到其他的推送技术。
  •    ③  并不是所有的代理服务器都支持或是允许WebSocket,因此这时还是需要退回到其他的推送技术。
  •    ④  WebSocket适合于游戏、交易型应用,事实上,它适合于任何服务器要向浏览器推送数据的场景。
  •    ⑤ Java有标准API(JSR-356),你可以在服务端通过它来处理WebSocket连接。
  •    ⑥ Spring在Java API的基础之上提供了一个API。对于Spring提供的支持来说,好消息是它对SockJS
  •         提供了服务器端的支持,你也可以毫无压力地使用依赖注入。Spring还对消息驱动的架构提供了
  •         STOMP支持。上面的两篇Spring文章都给出了GitHub上示例项目的链接,我强烈建议大家看看。
  •     ⑦ 长久以来,Atmosphere框架一直是服务器推送技术的解决方案。这里是WebSocket上手指南。
  •           另外,Cometd也提供了WebSocket支持

 在给出具体的示例代码前,我首先来介绍一下Socket的生命周期,包括客户端的与服务器端的:

 

  1. 浏览器发出一个HTTP请求,带有一个特殊的Upgrade头,其值是“websocket”。
  2. 如果服务器能够“理解”WebSocket,那么它会使用状态101进行应答——交换协议。从现在开始,我们就不再使用HTTP了。
  3. 当服务器接收这个TCP Socket连接后,一个初始化方法会得到调用,当前的WebSocket Session会被传递进来。每个Socket都有唯一一个Session id。
  4. 当浏览器向服务器发送消息时,另一个方法会得到调用,你在这里获得Session与消息负载。
  5. 根据某个负载参数,应用代码会执行一个动作。负载的格式完全取决于开发者。一般来说会使用JSON序列化的对象。
  6. 当服务器需要发送消息时,它需要获得这个Session对象,然后通过它来发送消息。
  7. 当浏览器关闭连接时,服务器会得到通知,这样它就可以清理与特定Session关联的一些资源了。

 

       目前,还没有任何一个API或框架能够支持基于注解的路由。Java API支持基于注解的端点处理器,不过每个连接URL需要一个类来处理,通常情况下,你希望在单个连接上执行多个操作。也就是说,你连接到ws://yourserver.com/game/,然后想要传递“joinGame”和“leaveGame”等消息。类似地,服务器需要发送回多种类型的消息。我使用了枚举来实现这一点,枚举中包含了所有可能的动作与事件类型,然后使用switch来确定该调用哪一个。

 

因此,我决定为我的算法音乐作曲家开发一个简单的游戏。它使用了Spring API,感兴趣的读者可以看看这个介绍,这是我在公司所做的一次演讲。下面是一些示例代码:

 

@Component
public class GameHandler extends WebSocketHandlerAdapter {
   private Map

 

下面来看一个示例场景,其中服务器需要向客户端发送消息。这就好比一个玩家加入了游戏一样,这时其他所有玩家都会收到有新人加入的通知。系统中的中心类是Game,它拥有一个玩家列表。如你所见,一个Player包含了一个对WebSocket Session的引用。这样,当新的玩家加入时,下面的Game中的方法就会得到调用:

 

public boolean playerJoined(Player player) {
   for (Player otherPlayer : players.values()) {
      otherPlayer.playerJoined(player);
   }
   players.put(player.getSession().getId(), player);
   return true;
}

 

player.playerJoined(..)会在连接之上发送一条消息,通知浏览器有新的玩家加入了:

public void playerJoined(Player player) {
   GameEvent event = new GameEvent(GameEventType.PLAYER_JOINED);
   event.setPlayerId(player.getSession().getId());
   event.setPlayerName(player.getName());
   try {
      session.sendMessage(new TextMessage(event.toJson()));
   } catch (IOException e) {
      new IllegalStateException(e);
   }
}

 

从服务器向浏览器发送消息可能还需要一个调度job进行触发。

关键在于你维护了一个所有已连接的浏览器列表,这样就可以向回发送信息了。这个列表可以是个静态属性,不过对于单例的Spring Bean来说就没必要这么做了。

 

现在,有两个重要的方面需要我们注意——安全与认证。这是来自于Heroku的一篇很不错的文章,对安全与认证进行了详细的介绍。如果还有其他敏感信息,你就应该使用wss(Websocket over TLS)了。你还应该在服务器端与客户端验证输入,而不应该依赖于Origin头,因为攻击者可以轻而易举地骗过浏览器。

 

认证可以依赖于HTTP Session cookie,不过显而易见的是,有些人更喜欢实现自己的类cookie工作流,从而获取一个短暂的令牌,它可以用于执行认证操作。

 

WebSocket使得DDD变得更加自然。你不必再处理贫血对象了,你的对象有各自的状态以及对这些状态的操作。与之相关的是,WebSocket应用的测试变得更加容易了。

 

在开发WebSocket应用时还有不少需要注意的事情。值得注意的是,你没有必要在任何地方都使用WebSocket,我将其限定在需要“推送”的场景下。

 

总的来说,WebSocket是一个很棒、很有趣的技术,它非常有希望灭掉所有采用hack手段实现的推送模拟技术。

   

分享到:
评论

相关推荐

    微信小程序 云笔记 (源码)

    微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小...

    笔记记录分享-笔记记录分享网站-笔记记录分享网站源码-笔记记录分享网站java代码-基于springboot的笔记记录分享网站

    笔记记录分享-笔记记录分享网站-笔记记录分享网站源码-笔记记录分享网站java代码-笔记记录分享网站设计与实现-基于springboot的笔记记录分享网站-基于Web的笔记记录分享网站设计与实现-笔记记录分享项目-笔记记录...

    狂神SpringBoot笔记+源码

    狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神...

    小程序源码 云笔记 (代码+截图)

    小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+...

    有道云笔记如何调整窗口大小?.docx

    有道云笔记窗口大小调整技巧 在使用有道云笔记时,调整窗口大小是非常重要的操作。合理的窗口大小设置可以提高工作效率和阅读体验。本文将介绍如何调整有道云笔记的窗口大小,提高笔记编辑和阅读体验。 一、调整...

    2020谷粒商城笔记资料,文档课件笔记+源代码(基础篇+高级篇

    2020谷粒商城笔记资料,谷粒商城2020文档课件笔记+源代码(基础篇+高级篇) 谷粒商城2020文档课件笔记+源代码(基础篇+高级篇) 2020谷粒商城笔记资料(基础篇+高级篇) 尚硅谷谷粒商城笔记,很全。基础篇,高级篇...

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip基于SSM框架+mysql搭建的云笔记...

    为知笔记4.2.476免登录

    《为知笔记4.2.476免登录——本地存储与便捷知识管理》 为知笔记,全称为“WizNote”,是一款受到广大用户喜爱的个人知识管理工具。其4.2.476版本提供了免登录的功能,这对于那些希望在不登录账户的情况下仅进行...

    大物上册手写笔记.pdf

    西电大学物理上册手写笔记,对于那些渴望在大学物理课程中取得优异成绩的学子来说,无疑是期末复习时的一盏指路明灯。由一位成绩优异的学生倾力编写,这份笔记不仅汇集了西电大学物理课程的核心知识点,而且以其深入...

    狂神笔记,b站狂神说课程笔记大全(最新)

    b站狂神说课程笔记大全,每个部分都有 狂神说java系列笔记(java基础+javaweb+ssm+微服务)全套 狂神说上课笔记未删减 Java基础到技术升级 1、JavaSE:Java入门 2、JavaSE:基础语法 3、JavaSE:流程控制 4、JavaSE...

    为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器

    为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序...

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip 基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip 基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip...

    2022吴恩达机器学习笔记汇总(共10章节).zip

    2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip...

    Java相关课程系列笔记之九Servlet学习笔记

    Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...

    软考中级笔记,系统集成项目管理工程师笔记.zip

    软考中级笔记,本人自己学习过程中记录的笔记内容。 课程学的是马老师的课程。参照此笔记默认有马老师的教程,或已对课本知识点内容有基础认识,本笔记也只是作为后期知识巩固和做题时辅助使用,前期肯定比较粗,...

    oracle adg安装个人笔记

    oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记...

    数据结构高分笔记part1

    这份“数据结构高分笔记part1”显然是为了帮助备考研究生入学考试的专业学生准备的,旨在提供深入的数据结构理解,助力他们在考试中取得优异成绩。 笔记可能涵盖以下几个关键知识点: 1. **基本概念**:首先,笔记...

    微信小程序——云笔记(截图+源码).zip

    微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序...

    杨超线代笔记.pdf

    杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代笔记.pdf杨超线代...

Global site tag (gtag.js) - Google Analytics