WebSocket实践
基本弄清楚了WebSocket的来龙去脉后,开始了实现WebSocket技术的探索。
看过一篇文章,测试了八种WebSocket框架性能,得以了解到实现WebSocket技术的框架有:
Netty、Undertow、Jetty、Vert.x、Grizzly、spray-websocket、node.js-websocket/Node.js、Golang
补充下:
作为老牌的servle容器,tomcat实际也可以实现WebSocket技术。
下面说一下我遇到的一个标准:JSR356标准:
JSR 356,对于WebSocket的的Java API
这标志着所有兼容JAVA EE 7的应用程序都必须实现这个API。
java开发人员不需要关注websocket具体的实现,而只要关注逻辑就可以了。
具体带来的好处是,比如java EE容器,必须实现这个标准,使我们的编码可以统一规范(之前是如果你使用jetty,那么使用jetty的jar包实现websocket是一套API,如果你使用tomcat,那么使用tomcatjar包实现websocket是一套API,而现在统一的使用一套就可以了)。
但是jetty是在9.1版本之后才实现的(起初我的demo项目怎么也访问不到服务端的websocket,是jetty版本过低。),tomcat是在7之后实现的。
下面是具体实现的代码
1.首先需要引用jar包
scope为provided,为了防止容器本身的websocket音响。
<dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>7.0</version><scope>provided</scope></dependency>
2.服务端的代码:
package com.lanyoung.im.back.ly.websocket;import javax.websocket.OnClose;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import java.io.IOException;@ServerEndpoint("/websocket")public class WebSocketTest {@OnMessagepublic void onMessage(String message, Session session)throws IOException, InterruptedException {// Print the client message for testing purposesSystem.out.println("Received: " + message);// Send the first message to the clientsession.getBasicRemote().sendText("This is the first server message");// Send 3 messages to the client every 5 secondsint sentMessages = 0;while(sentMessages < 3){Thread.sleep(5000);session.getBasicRemote().sendText("This is an intermediate server message. Count: "+ sentMessages);sentMessages++;}// Send a final message to the clientsession.getBasicRemote().sendText("This is the last server message");}@OnOpenpublic void onOpen () {System.out.println("Client connected");}@OnClosepublic void onClose () {System.out.println("Connection closed");}}
3.客户端代码
<!DOCTYPE html><html><head><title>Testing websockets</title></head><body><div><input type="submit" value="Start" onclick="start()" /></div><div id="messages"></div><script type="text/javascript">var webSocket =new WebSocket('ws://localhost:8080/websocket');webSocket.onerror = function(event) {onError(event)};webSocket.onopen = function(event) {onOpen(event)};webSocket.onmessage = function(event) {onMessage(event)};function onMessage(event) {document.getElementById('messages').innerHTML+= '<br />' + event.data;}function onOpen(event) {document.getElementById('messages').innerHTML= 'Connection established';}function onError(event) {alert(event.data);}function start() {webSocket.send('hello');return false;}</script></body></html>
WebSocket实践的更多相关文章
- 实时Web与WebSocket实践
引言:实时Web越来越被重视,Google.Facebook等大公司也逐渐开始提供实时性服务.实时Web将是未来最热门的话题之一. 本文选自<基于MVC的JavaScript Web富应用开发 ...
- WebSocket实践——Java实现WebSocket的两种方式
什么是 WebSocket? 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...
- WebSocket学习与使用
1.WebSocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议,其目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,使得服务器可以主动发送消息给浏览器.在HTML ...
- SpringBoot | 第十九章:web应用开发之WebSocket
前言 web开发也讲解了三章了,这章节开始讲解关于与前端通信相关知识.实现一个在线聊天室类似的功能或者后端推送消息到前端,在没有WebSocket时,读大学那伙还有接触过DWR(Direct Web ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- WebSocket原理与实践(四)--生成数据帧
WebSocket原理与实践(四)--生成数据帧 从服务器发往客户端的数据也是同样的数据帧,但是从服务器发送到客户端的数据帧不需要掩码的.我们自己需要去生成数据帧,解析数据帧的时候我们需要分片. 消息 ...
- WebSocket原理与实践(三)--解析数据帧
WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义: 在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...
- WebSocket原理与实践(二)---WebSocket协议
WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...
- WebSocket原理与实践(一)---基本原理
WebSocket原理与实践(一)---基本原理 一:为什么要使用WebSocket?1. 了解现有的HTTP的架构模式:Http是客户端/服务器模式中请求-响应所用的协议,在这种模式中,客户端(一般 ...
随机推荐
- flutter 底部bottomNavigationBar凸起效果
概要 最近在做flutter 的时候,之前看到想实现 底部导航栏中间按钮 凸起效果, 最近想做又突然找不到方案了,因此记录下这里的实现方式. 预览效果 代码 主要使用 BottomAppBar 组建, ...
- luaj使用 方法签名规则 Cocos2dxLuaJavaBridge
function AndroidHandler:getParamJson() local args = {nil} local ok,ret = luaj.callStaticMeth ...
- VBA文件对话框的应用(VBA打开文件、VBA选择文件、VBA选择文件夹)
在VBA中经常要用到文件对话框来进行打开文件.选择文件或选择文件夹的操作.用Microsoft Office提供的文件对话框比较方便.用法如下Application.FileDialog(fileDi ...
- 关于Modelsim安装闪退
在盗版Windows系统上,安装Modelsim时可能出现闪退. 现象表现为,在任务管理器中仍然有Modelsim的进程,但是看不到安装界面. 碰到这种情况可以尝试如下方法:退到安全模式下安装. 一般 ...
- php 数据导出到excel 2种带有合并单元格的导出
具体业务层面 可能会有所不同.以下两种方式涉及的合并单元格地方有所不同,不过基本思路是一致的. 第一种是非插件版本.可能更容易理解点,基本思路就是 组装table 然后 读取 输出到excel上.缺点 ...
- 关于CTreeView中CTreeCtrl空间的使用
昨天QQ群里有人问我怎么实现CTreeCtrl的功能,说实话,我也是一个VC 的初级学者,没有弄过CTreeView的代码,参考了MSDN后,写了一小段代码,和大家一起分享,其中包括窗口切分,都是比较 ...
- php算法题---对称的二叉树
php算法题---对称的二叉树 一.总结 一句话总结: 可以在isSymmetrical()的基础上再加一个函数comRoot,函数comRoot来做树的递归判断 /*思路:首先根节点以及其左右子树, ...
- thinkphp一键清除缓存的方法
后台控制器: <?php namespace Home\Controller; use Think\Controller; class HuancuController extends Cont ...
- QtCreator 生成动态库
在Windows平台上,QtCreator( MinGW4.9.2 )创建动态库,最终生成的文件是libHello.a.Hello.dll和hello.o这3个文件(假设在D:/Lib文件夹下面) 在 ...
- 阿里云CentOs7上安装Mysql
前提:虽然yum源上有mysql,但是好像没有mysql-server,所以我们还是选择自己从官网上下载安装 一.新建文件夹,然后下载解压 cd /usr/ #新建mysql文件夹 mkdir mys ...