一、概述

作为HTML5新特性之一的WebSocket组件,在实时性有一定要求的WEB应用开 发中还是有一定用武之地,高版本的IE、Chrome、FF浏览器都支持Websocket,标准的Websocket通信是基于RFC6455实现服务 器端与客户端握手与消息接发的。如果对Websocket通信不是太理解,可以查看RFC文档即可,简单说就是通过发送HTTP请求,实现双方握手,将无 状态的HTTP通信协议进一步升级成有状态的通信协议,同时Websocket还支持子协议选项与安全传输。标准的websocket连接URL以ws开 头,如果是基于TLS的则以wss开头。基于Websocket可以很方便的开发基于web聊天程序,各种网页消息通知与推送通知。

如果非要扒一扒Websocket的今生前世的话,还记得最早的基于HTTP轮询实现网页即时通信的方式,那种 做法比较消耗资源、于是有人改进了编程CometD长连接方式,可是本质上还是换汤不换药,而websocket的出现正好解决了这些问题,但是很多浏览 器的低版本还是不支持websocket,于是还催生了一些基于websocket理念实现的JS通信框架,其中学得比较像的有SockJS与 socket.io,他们都号称支持websocket,然后如果浏览器端不支持原生的websocket,它们会自动启用fallback选项使用其它 诸如ajax、Http轮询、长轮询/连接、甚至是flash的socket等机制实现模拟websocket的工作方式,但是他们最大的弊端是如果客户 端使用了这些框架,服务器必须用它们,否则等待开发者就是一大堆无法回避的问题,同时很多都是无解的。主要原因在于它们实现自己的协议集,不照它们的格式 处理数据没法玩。闲话说的有点多。

二、实现步骤

Tomcat7的高版本中实现了Websocket服务器端RFC6455标准协议,可以跟浏览器端websocket进行通信,首先要做好如下几步:

1.安装高版本JDK – JDK8

2.安装Tomcat 7.0.64

3.在eclipse中建立一个动态的web项目

根据JSR标准,Java中实现websocket的标准接口可以基于注解方式,tomcat也搞好了,只有我们实现如下代码,即可创建一个websocket回声服务器:

package com.websocket.demo;

import java.io.IOException;

import java.nio.ByteBuffer;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/echo")

public class EchoExample {

@OnMessage

public void echoTextMessage(Session session, String msg, boolean last) {

try {

if (session.isOpen()) {

System.out.println("received from client message = " + msg);

session.getBasicRemote().sendText(msg, last);

}

} catch (IOException e) {

try {

session.close();

} catch (IOException e1) {

}

}

}

@OnOpen

public void openConn(Session session) throws IOException {

session.getBasicRemote().sendText("hello web socket"); // means open it

}

@OnMessage

public void echoBinaryMessage(Session session, ByteBuffer bb, boolean last) {

System.out.println("send binary message...");

try {

if (session.isOpen()) {

System.out.println("byte buffer lenghth : " + bb.array().length);

System.out.println("byte buffer content: " + ((bb.array()[0]) & 0xff));

System.out.println("byte buffer content: " + ((bb.array()[1]) & 0xff));

System.out.println("byte buffer content: " + ((bb.array()[2]) & 0xff));

session.getBasicRemote().sendBinary(bb, last);

}

} catch (IOException e) {

try {

session.close();

} catch (IOException e1) {

// Ignore

}

}

}

}

如何在tomcat中启动websocket服务器,首先需要在web.xml添加如下配置:

[listener]

[listener-class]org.apache.tomcat.websocket.server.WsContextListener[/listener-class]

[/listener]

然后实现ServerApplicationConfig接口,实现如下:

创建网页echo.html,内容如下:

[html]

[head]

[title>Web Socket Echo Test[/title]

[script]

var ws = null;

var count = 0;

function setConnected(connected) {

document.getElementById('connect').disabled = connected;

document.getElementById('disconnect').disabled = !connected;

document.getElementById('echo').disabled  = !connected;

}

function connect() {

var target = document.getElementById('target').value;

if (target == '') {

alert('Please select server side connection implementation.');

return;

}

if ('WebSocket' in window) {

ws = new WebSocket(target);

} else if ('MozWebSocket' in window) {

ws = new MozWebSocket(target);

} else {

alert('WebSocket is not supported by this browser.');

return;

}

ws.onopen = function () {

setConnected(true);

log('Info: WebSocket connection opened.');

};

ws.onmessage = function (event) {

log('Received: ' + event.data);

tomcat处理html流程,基于Tomcat运行HTML5 WebSocket echo实例详解相关推荐

  1. 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口

    HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...

  2. java编译不报错但运行啥都没_java编译时与运行时概念与实例详解

    java编译时与运行时概念与实例详解 发布于 2020-7-29| 复制链接 本篇文章通过实例对 java程序编译时与运行时进行了详解,需要的朋友可以参考下 Java编译时与运行时很重要的概念,但是一 ...

  3. html5 websocket php,HTML5 WebSocket技术使用详解

    WebSocket WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术. 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔( ...

  4. java运行时_java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...

  5. php 调用日历控制,基于ThinkPHP实现的日历功能实例详解

    本文实例讲述了基于ThinkPHP实现的日历功能.分享给大家供大家参考,具体如下: 开发环境介绍 最新,闲来没事,便开发了一款简单的日历,来统计工作情况.为了开发便捷,使用ThinkPHP架构.界面如 ...

  6. java mysql教程基于_java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JD ...

  7. php 日历排班的例子,基于ThinkPHP实现的日历功能实例详解

    搜索热词 本文实例讲述了基于ThinkPHP实现的日历功能.分享给大家供大家参考,具体如下: 开发环境介绍 最新,闲来没事,便开发了一款简单的日历,来统计工作情况.为了开发便捷,使用ThinkPHP架 ...

  8. 基于Servlet3.0的编程式SpringMVC实例详解

    传统的SpringMVC应用都是基于web.xml配置的,首先使用context listener启动Spring上下文,再配置一个DispatcherServlet启动一个WebApplicatio ...

  9. php使用redis分布式锁,php基于redis的分布式锁实例详解

    在使用分布式锁进行互斥资源访问时候,我们很多方案是采用redis的实现. 固然,redis的单节点锁在极端情况也是有问题的,假设你的业务允许偶尔的失效,使用单节点的redis锁方案就足够了,简单而且效 ...

最新文章

  1. QIIME 2教程. 32如何写方法和引用Citing(2020.11)
  2. 如何使用log.debug()
  3. 排便的快感--不是非主流
  4. 移除Kubeadm部署的kubernetes环境
  5. Enigma密码机初步解析
  6. html5 页面整体居中,html5标题居中 DIV布局怎么在页面水平居中
  7. 国内做市场情报公司前10名
  8. windows10打开natapp.exe 报Error: oppen NUL: The system cannot find the file specified.
  9. 码云推送代码后不显示贡献度
  10. 网站banner设计有什么好的方法
  11. 孤儿文档是怎样产生的(MongoDB orphaned document)
  12. 单片机交通灯灯c语言程序,51单片机用C语言实现交通灯(红绿灯)源程序
  13. android bea拷贝,从Android开发中学到一些东西
  14. mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法
  15. 关于onMeasure
  16. git的使用(开发常用到的)
  17. 数据集处理(二)——Tiny-imagenet
  18. MVC 网上招聘系统的设计与实现java jsp 程序设计 课程设计 毕业设计-附源码02135
  19. 华硕幻X GZ301VV VU VF原厂系统恢复带ASUS Recovery
  20. 为什么说云计算运维是新“贵”?

热门文章

  1. Mac 上设置显示器相关参数介绍
  2. C语言对于轴对称图形输出的分析
  3. sql注入漏洞,应屏蔽SQL注入攻击
  4. js将数组转化成json
  5. 抠图怎么抠?这几种抠图方法分享给大家
  6. antd table修改没有数据时的显示
  7. 占位符语法-Scala
  8. win10打开软件中文乱码怎么修复
  9. ggplot2设置坐标轴范围_ggplot2|详解八大基本绘图要素
  10. wincc报表日报表实例_wincc 报表,涉及变量计算的日报表怎么做