websocket实战(1) 入门

1.WebSocket介绍

1.1 概念

WebSocket是HTML5中一系列新的API,或者说新规范,新技术。支持页面上使用Web Socket协议与远程主机进行全双工的通信。它引入了WebSocket接口并且定义了一个全双工的通信通道,通过一个单一的套接字在Web上进行操作。

1.2 websocket vs HTTP

首先,web技术发展经历了以下阶段。

  • 静态页面(html)
  • 动态页面(cgi,j2ee,php...)
  • Ajax技术
  • comet技术(轮询)

1.2.1 实现方案对比

举个简单的例子,以51cto的消息推送为例。

下面,就用提到的技术实现这个小小的功能,分析下利弊。

  1. 静态页面就不说了,它一般应用在页面缓存级别,但消息条目明显有一定时效的,不适用该场景。
  2. 动态页面,为了更新消息数目,刷新整个页面,下面所有的页面重新渲染,效率也不加。
  3. ajax技术,可以实现局部页面刷新,通过HTTP轮询,获取消息条目。即使没有新消息,也必须发送请求,产生无意义的请求。请求间隔太长,实时性存在问题;间隔太端,浪费服务器资源和占用带宽。
  4. comet技术,基于HTTP长连接,是反向Ajax(Reverse Ajax)一种实现,能够从服务器端向客户端发送数据,实现了连接的复用。 两种实现方式各有利弊。(1)基于Ajax的长轮询(long-polling)方式;(2)基于 Iframe 及 htmlfile 的流(http streaming)方式。

websocket实现方案

与http协议不同的请求/响应模式不同,HTML5 Web Sockets以最小的开销高效地提供了Web连接 ,极大的减少了不必要的网络流量与延迟。一个Web客户端通过websocket连接到一个远程端点,进行全双工的通信,提高了实时性,不存在浪费服务资源问题。

1.2.2 websocket 与http关系

两者都是应用层的开发规范,websocket是基于http的,Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已。

http支持长连接;但websocket是持久连接。

1.3 websocket场景

1.社交订阅

2.多玩家游戏

3.协同编辑/编程

4.点击流数据

5.股票基金报价

6.体育实况更新
7.多媒体聊天
8.基于位置的应用

9.在线教育

2. 我的websocket 项目

项目还在不断完善之中。里面包含了若干个websocket例子。例子,包括游戏类,聊天类,画板类....

本人,比较喜欢学一门技术的原则“无论如何先跑起来”,搜集这些例子,花费了个人近3天时间。

希望对大家有用。

项目地址:https://github.com/janecms/websocket_example

3. 声明服务端websocket服务(Endpoint)的两种方式

最主要的内容就是声明EndPoint。

创建服务端步骤

  1. Create an endpoint class.
  2. Implement the lifecycle methods of the endpoint.
  3. Add your business logic to the endpoint.
  4. Deploy the endpoint inside a web application.

3.1编程式

Endpoint中的onOpen,onClose,onError对应websocket的生命周期。

1.创建Endpoint

public class EchoEndpoint extends Endpoint {
   @Override
   public void onOpen(final Session session, EndpointConfig config) {
      session.addMessageHandler(new MessageHandler.Whole<String>() {
         @Override
         public void onMessage(String msg) {
            try {
               session.getBasicRemote().sendText(msg);
            } catch (IOException e) { ... }
         }
      });
   }
}

2.部署endpoint

ServerEndpointConfig.Builder.create(EchoEndpoint.class, "/echo").build();

具体参见:

https://github.com/janecms/websocket_example中的<websocket.echo.EchoEndpoint>.

3.2 注解声明式

更简单。

@ServerEndpoint("/echo")
public class EchoEndpoint {
   @OnMessage
   public void onMessage(Session session, String msg) {
      try {
         session.getBasicRemote().sendText(msg);
      } catch (IOException e) { ... }
   }
}

具体参见

https://github.com/janecms/websocket_example中的<websocket.echo.EchoAnnotation>.

相关annotation说明

Each websocket endpoint may only have one message handling method for each of the native websocket
message formats: text, binary and pong

一个endpoint只能有一个被@OnMessage修饰的处理文本,二进制,pone信息的的方法。这个限制,不同的环境,会有所区别。

4.html5 websocket 实现客户端

客户端,也对应生命周期。onOpen,onClose,onMessage,onError。

var wsocket;
function connect() {
   wsocket = new WebSocket("ws://localhost:8080/dukeetf2/dukeetf");
   wsocket.onmessage = onMessage;//定义回调
    websocket.onerror = function(evt) {
        onError(evt)
    };   
}
function onMessage(evt) {
   var arraypv = evt.data.split("/");
   document.getElementById("price").innerHTML = arraypv[0];
   document.getElementById("volume").innerHTML = arraypv[1];
}
...
window.addEventListener("load", connect, false);

5. websocket协议交互数据

和标准HTTP,存在很大不同。

5.1 请求数据

GET /path/to/websocket/endpoint HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost
Sec-WebSocket-Version: 13

5.2 响应数据

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

5.3 websocket的请求URL,也不是标准http schema。

普通:ws://host:port/path?query
加密:wss://host:port/path?query

参考资源

https://www.oschina.net/translate/9-killer-uses-for-websockets

http://www.tuicool.com/articles/FBbaai

https://docs.oracle.com/javaee/7/tutorial/websocket.htm

https://github.com/janecms/websocket_example

结论

主要讲了websocket与http的异同,以及websoket的优势和使用场景。简单探讨了2中声明websocket方式。最后分享了自己的展示项目。 接下来,通过案例实战,演练编码解码,错误处理在websocket的使用。

时间: 2024-10-01 06:42:22

websocket实战(1) 入门的相关文章

websocket实战(3) 错误处理及配置管理

回顾 websocket实战(1) 入门 websocket实战(2) 信息处理发送.接收和编码 通过前面说明,已经轻松构建一个简单的websocket ServerEndPoint了.可以为EndPoint加上解码器,编码器,为EndPoint提供支持.但是,作为一个服务器,遇到错误怎么办?websocket作为一个简单的容器组件,也具备简单配置管理功能. 1.错误处理 [email protected] 其实很简单,就是在ServerEndPoint类中,添加一个方法,要求该方法被@onEr

websocket实战(4) websocket版贪食蛇游戏(tomcat官方自带)

websocket实战(1) 入门 websocket实战(2) 信息处理发送.接收和编码 websocket实战(3) 错误处理及配置管理 通过前面3篇的阐述,相信可以构建一个简单的socket应用了.当然,也会遗漏了许多知识点,相信会在以后分享的实例中捎带说明下. 本文的主要是分析下tomcat官方自带的贪食蛇游戏.为什么选择分析这个项目呢. 贪食蛇游戏规则,人人明白,业务方面不需要过多解释(当然这款websocket版的游戏规则也有一定特色). 游戏设计简单,一个对象足以完成游戏,但不涉及

【书籍推荐】Spring实战-----Spring入门经典

如果看完了Servlet学习指南后,可以开始考虑使用框架了,这时候是完全没有什么问题的,因为有太多的开发者在帮我们解决问题了,作为一个新手,我们可以先使用别人的轮子,等到使用得很熟练,技术提高了,我们才考虑制造一些小轮子,当然这个过程需要很长的时间,但我相信只要不断的学习,就一定能成功. 当然,个人认为这本书只是入门级,因为文档是更好的资料,但是每个人迈出的第一步都倾向于轻松有趣,另外看英文版当然是更好有更好的提升,但是个人认为既然入门就可以选择看中文版的快速入门,然后再看英文版的文档,或者在下

大侠唐在飞 《实战juniper入门课程》

大侠唐在飞在51CTO学院推出的一个以经验传递.实战为主的juniper入门课程,现场录制已经有三分之一了,欢迎大家捧场,提宝贵意见.http://edu.51cto.com/course/course_id-3284.html. 实战juniper入门课程 QQ群  263642196 只有付费学员才能加入,加入需提供付费的51CTO用户名.本群为大家提供技术交流.解疑释惑.资料分享使用(参考资料.案例.学习资料.认证资料). 培训内容安排 1 关于实战juniper入门课程 2 Junipe

OpenDayLight(硼Boron版本)实战开发入门

   OpenDayLight(硼Boron版本)实战开发入门 OpenDayLight[1](简写为ODL)的硼Boron(0.5.0)版本于2016-09-16这几天刚刚发布.作为一款开源SDN网络控制器,依托于强大的社区支持以及丰富的功能特性,ODL成为了目前主流的SDN网络控制器开发平台.不仅为开发者提供了大量的网络管理功能,而且藉由AD-SAL(API驱动的服务层)和MD-SAL(模型驱动的服务层),给独立的网络应用提供了完善的二次开发接口.由于OpenDaylight架构的复杂性

关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市

?? 承蒙广大读者的厚爱我的 <iOS实战:入门与提高卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11766718.html 欢迎关注关东升新浪微博@tony_关东升. 关注智捷课堂微信公共平台,了解最新技术文章.图书.教程信息 更多精品iOS.Cocos.移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php 版权声明:本文为博主原

C# WebApi+Task+WebSocket实战项目演练(四)

一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和完善此系列课程!本高级系列课程适合人群如下: 1.有一定的NET开发基础并对WebApi.Task.WebSocket技术有一定了解和认识. 2.喜欢阿笨的干货分享课程的童鞋们. 希望大家在选择阿笨的 C#高级编程实战技能开发宝典课程系列的时候,根据自身的情况进行选择,由于本次课程不是零基础教学课程系列,所

WebSocket.之.基础入门-建立连接

WebSocket.之.基础入门-建立连接 1. 使用开发工具(STS.Eclipse等)创建web项目.如下图所示,啥东西都没有.一个新的web项目. 2. 创建java类.index.jsp页面.注意:web.xml未做任何改动. TestConfig.java 代码如下: 1 package com.charles.socket; 2 3 import java.util.Set; 4 5 import javax.websocket.Endpoint; 6 import javax.we

WebSocket.之.基础入门-前端发送消息

WebSocket.之.基础入门-前端发送消息 在<WebSocket.之.基础入门-建立连接>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 index.jsp 两个文件. 项目结构如下图: TestSocket.java 1 package com.charles.socket; 2 3 import javax.websocket.OnMessage; 4 import javax.websocket.OnOpen; 5 import javax.webs

WebSocket.之.基础入门-后端响应消息

WebSocket.之.基础入门-后端响应消息 在<WebSocket.之.基础入门-前端发送消息>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 index.jsp 两个文件. 项目结构如下: TestSocket.java 代码 1 package com.charles.socket; 2 3 import java.io.IOException; 4 5 import javax.websocket.OnMessage; 6 import javax.w