前段时间在研究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的更多相关文章

  1. springmvc2 一个控制器写多个方法(非注解方式)

    出处:http://blog.csdn.net/xuewenke/article/details/23895999 springmvc2 一个控制器写多个方法(非注解方式) 分类: spring 20 ...

  2. Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法

    Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx" ...

  3. 05_IOC容器装配Bean(注解方式)

    IOC容器装配Bean(注解方式) 1.使用注解方式进行Bean注册 xml 方式: <bean id="" class=""> spring2.5 ...

  4. spring aop 使用注解方式总结

    spring aop的注解方式:和xml的配置方式略有区别,详细如下: 1.首先还是建立需要的切面类:切面类里面定义好切点配置,以及所有的需要实现的通知方法. /** * */ package com ...

  5. mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类

    相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的 ...

  6. springMVC注解方式+easyUI+MYSQL配置实例

    刚接触springMVC,使用的注解方式,也在学习阶段,所以把自己学习到的记下来.本文利用springMVC从数据库读取用户信息为例,分享一下. 1.准备相关架包及资源.因为使用springMVC+e ...

  7. Spring 使用纯注解方式完成IoC

    目录 创建一个简单的Person类 使用xml方式配置Spring容器并获取bean的过程 创建xml配置文件 进行测试 使用纯注解方式配置Spring容器并获取bean的过程 创建spring配置类 ...

  8. 浅谈spring中AOP以及spring中AOP的注解方式

    AOP(Aspect Oriented Programming):AOP的专业术语是"面向切面编程" 什么是面向切面编程,我的理解就是:在不修改源代码的情况下增强功能.好了,下面在 ...

  9. 十九、Spring框架(注解方式测试)

    一.注解方式测试 1.注解方式测试使用junit.使用junit-4.12.jar和hamcrest-all-1.3.jar(单元测试包) 把这两个jar包,导入到lib文件夹下. 2.TestSpr ...

随机推荐

  1. Linux_文件打包,压缩,解压

    一.压缩命令 文件格式:*.gz 命令:gzip 文件名 (ps:不能压缩目录,切压缩后不保留原文件) 压缩前 -rw-r--r--. 1 root root 315 Sep 6 21:03 df.t ...

  2. Top Deep Learning Projects in github

    Top Deep Learning Projects A list of popular github projects related to deep learning (ranked by sta ...

  3. zk 获取session,request,servletContext,response

    (参考:http://www.dotblogs.com.tw/rockywang/archive/2010/01/13/12995.aspx) HttpServletRequest request = ...

  4. JQuery 遍历子元素+ each函数的跳出+提取字符串中的数字

    最近脑袋迷糊的如同一团浆糊,一直出错. HTML代码如下图,现在想实现的功能是根据Ajax请求,获取到具体的button,以更新其样式.由于Button较多,每个Button都设置id,没有意义,想通 ...

  5. OSI七层&TCP&IP协议

    OSI七层: OSI七层与ICP/IP概念层的对应: ICP/IP概念层上的网络设备: IP(Internet Protocol网际协议):计算机之间的通信 IP(网络协议)位于网络层,作用是把各种数 ...

  6. EF框架中加子类后出现列名 'Discriminator' 无效问题

  7. javascript保留关键字

    1.通用保留关键字 break delete function return typeof case do if switch var catch else in this void continue ...

  8. 20145334 《Java程序设计》第10周学习总结

    20145334 <Java程序设计>第10周学习总结 教材学习内容总结 一.网络编程 •网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入 ...

  9. Read4096

    Given API: int Read4096(char* buf); It reads data from a file and records the position so that the n ...

  10. Cookie 知识点再整理

    1. Cookie  是存储在客户端 内存 或者 硬盘(例如火狐把 Cookie 存储在 C:\Documents and Settings\用户名\Application Data\Mozilla\ ...