一个注解方式webSocket demo
前段时间在研究websocket.其中遇到了一些bug。这里跟大家分享这过程。
首先介绍一下websocket
WebSocket是HTML5的一种新协议,实现了浏览器和服务器的双全工通信,能更好的节省服务器资源和带宽并达到实时通信。同时WebSocket是建立在TCP之上,同HTTP一样通过TCP来通信。WebSocket需要类似TCP的客户端和服务端的握手连接然后进行通信。但websocket与传统的HTTP每次请求-应答都需要客户端和服务端建立连接模式不同的是websocket类似socket的TCP长连接的通讯模式,在客户端断开websocket连接或服务端断开连接前,不需要客户端和服务端重新发起连接请求。一旦websocket建立连接之后,后续的数据都是以帧序列的形式传输。
此websocket demo的后台使用的是Java写的,如下:
import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/myecho")
public class WSDemo { // Logger log = Logger.getLogger(getClass()); //当前在线人数
private static int onlineCount = 0;
//用一个set集合保存几个websocket实例
private static CopyOnWriteArraySet<WSDemo> wsSet = new CopyOnWriteArraySet<WSDemo>();
//websocket的session
private Session session; /**
* 客户端新建websocket时会触发(握手协议后)
* 并加入当前的set集合中
* @param session
*/
@OnOpen
public void wsOpen(Session session) {
this.session = session;
wsSet.add(this);//加入集合
// 在线人数加1
addOnlineCount();
} //当websocket退出的时候触发,并在set集合中删除当前websocket
@OnClose
public void wsClose(){
wsSet.remove(this); //删除
//在线人数-1
subOnlineCount();
} /**
* 接收到客户端发来的消息并处理,同时也像客户端发送消息
* @param message
* @param session
*/
@OnMessage
public void wsMessage(String message, Session session) {
sendMessage(message);
System.out.println("=====客户端发来消息:" + message);
System.out.println("======websocket 数量:" + wsSet.size());
//群发消息
for(WSDemo wss: wsSet) {
wss.sendMessage("服务端发来的消息"); //向客户端发送消息
}
} //websocket错误的时候丢出一个异常
@OnError
public void wsError(Session session, Throwable throwable) {
throw new IllegalArgumentException(throwable);
} //send message 发送消息处理方法
public void sendMessage(String message) {
try {
this.session.getBasicRemote().sendText(message);
System.out.println("===============发送了消息:" + message);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
} // get onlinecount
public static synchronized int getOnlineCount() {
return onlineCount;
} // +1
public static synchronized void addOnlineCount() {
WSDemo.onlineCount++;
System.out.println("++++++++++++++上线人数+1:" + onlineCount);
} //-1
public static synchronized void subOnlineCount() {
WSDemo.onlineCount--;
System.out.println("---------------线上人数-1:" + onlineCount);
} }
前端代码就相对简单,直接使用我们注册的'/myecho' websocket服务端
var wsuri = "ws://localhost:8080/wsdemo/myecho";
var ws = null; function dows() {
//判断浏览器是否支持websocket
if("WebSocket" in window || window.WebSocket) {
ws = new WebSocket(wsuri);
} else {
alert("browser not support websocket...");
// throw "browser not support websocket..."; //这种写法是可以的
throw new Error("browser not support websocket...");//这种也是可以
return false
}
ws.onopen = function(evt) {
wsObj.wsopen(evt);
}
ws.onmessage = function(evt) {
wsObj.wsmsg(evt);
}
ws.onclose = function(evt) {
wsObj.wsclose(evt);
}
ws.onerror = function(evt) {
wsObj.wserror(evt);
}
/*ws.send("my message...");*/
} var wsObj = {
wsopen:function(evt) {
console.log(evt.type);
document.querySelector("#clientSuc").innerHTML = "websocket connect success...";
},
wsmsg:function(msg) {
debugger;
console.log("type:"+msg.type);
//document.getElementById("msg").innerHTML = msg.data;
console.log("data:" + msg.data);
document.querySelector("#msg").innerHTML = msg.data;
// ws.close(); //关闭websocket
},
wsclose:function(evt) {
console.log("type:" + evt.type);
},
wserror:function(evt) {
console.log("type:" + evt.type);
}
};
function sendMsg (){
var msg = "hello websocket...";
ws.send(msg);
}
function closeWebsocket() {
ws.close();
} window.addEventListener("load", dows, false);
这里需要注意到的是:因为websocket是j2ee 7 以上的版本所以需要jdk版本1.7以上,而且tomcat服务器的支持也有区别,比如tomcat7不会自动把'websocket-api.jar'引入,而tomcat8则会。如果使用tomcat7的版本且没有自己手动添加tomcat的library引入'websocket-api.jar'这个jar包的话前台会报404找不到websocket服务的异常。这个bug我搞了半天才知道原来是tomcat版本的问题。
一个注解方式webSocket demo的更多相关文章
- springmvc2 一个控制器写多个方法(非注解方式)
		
出处:http://blog.csdn.net/xuewenke/article/details/23895999 springmvc2 一个控制器写多个方法(非注解方式) 分类: spring 20 ...
 - Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法
		
Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx" ...
 - 05_IOC容器装配Bean(注解方式)
		
IOC容器装配Bean(注解方式) 1.使用注解方式进行Bean注册 xml 方式: <bean id="" class=""> spring2.5 ...
 - spring aop 使用注解方式总结
		
spring aop的注解方式:和xml的配置方式略有区别,详细如下: 1.首先还是建立需要的切面类:切面类里面定义好切点配置,以及所有的需要实现的通知方法. /** * */ package com ...
 - mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类
		
相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...
 - springMVC注解方式+easyUI+MYSQL配置实例
		
刚接触springMVC,使用的注解方式,也在学习阶段,所以把自己学习到的记下来.本文利用springMVC从数据库读取用户信息为例,分享一下. 1.准备相关架包及资源.因为使用springMVC+e ...
 - Spring 使用纯注解方式完成IoC
		
目录 创建一个简单的Person类 使用xml方式配置Spring容器并获取bean的过程 创建xml配置文件 进行测试 使用纯注解方式配置Spring容器并获取bean的过程 创建spring配置类 ...
 - 浅谈spring中AOP以及spring中AOP的注解方式
		
AOP(Aspect Oriented Programming):AOP的专业术语是"面向切面编程" 什么是面向切面编程,我的理解就是:在不修改源代码的情况下增强功能.好了,下面在 ...
 - 十九、Spring框架(注解方式测试)
		
一.注解方式测试 1.注解方式测试使用junit.使用junit-4.12.jar和hamcrest-all-1.3.jar(单元测试包) 把这两个jar包,导入到lib文件夹下. 2.TestSpr ...
 
随机推荐
- Odoo Website 替换 谷歌地图为 百度地图
			
由于众所周知的原因,国内使用谷歌地图是件非常痛苦的事,更为接地气的做法是替换为百度地图. 模块地址参见群公告. 演示地址:http://timesup.cn:8069
 - 网络地址转换NAT原理及其作用
			
1 概述 1.1 简介 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task F ...
 - MySQL数据库相关命令
			
1.命令:show create table 表名 功能:获取建表语句 2.命令:desc 表名 功能:展示表字段及其类型
 - CSS3部分新特性
			
1.旋转transform:rotate(30deg);-ms-transform:rotate(30deg); /* IE 9 */-moz-transform:rotate(30deg); /* ...
 - Python打包成exe程序
			
如何把.py文件打包成.exe可执行程序. 这里选择用PyInstaller 3.0来打包,PyInstaller 3.0下载地址:https://pypi.python.org/pypi/PyIns ...
 - php数字操作,高精度函数,保留计算结果小数位
			
$l = 45456.51; $r = 455778.44; $e = '100.00'; $f= '500.00'; $res = bcadd($l, $r,3);//小数点后的位数,精度就是由这个 ...
 - iOS审核秘籍】提审资源检查大法
			
iOS审核秘籍]提审资源检查大法 2015/11/27 阅读(752) 评论(1) 收藏(6) 加入人人都是产品经理[起点学院]产品经理实战训练营,BAT产品总监手把手带你学产品点此查看详情! 本篇主 ...
 - flush vs ob_flush
			
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等).该函数将当前为止程序的所有输出发送到用户的浏览器. flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响. ...
 - 简单粗暴下载Spring
			
http://repo.springsource.org/libs-release-local/org/springframework/spring/4.3.3.RELEASE/(想要下载什么版本,替 ...
 - c#创建、安装、卸载、调试windows服务的简单事例
			
最近工作中用到了windows服务,对其有深刻理解和丰富经验谈不上,本篇文章只是简单陈诉用c#创建.安装.卸载.调试windows服务的步骤. 一.创建windows服务 1.用VS创建windows ...