开发环境:

JDK:1.7及以上

JavaEE:1.7,因为只有javaee7才有websocke的api,也可以使用1.6单都导入websocket-api.jar试试(本人不清楚)

注意:没有使用springmvc websocket包,利用的是JavaEE7  javax.websocket包,不需要任何xml配置

    springMVC也集成了websocket,不了解

--------------------------------------------------------------------------------------------------------------------------------------------

Servlet和JSP规范版本对应关系:

 Servlet规范版本  JSP版本  JSF版本  JAVA EE版本
 Servlet2.3  JSP1.2、JSP1.1    J2EE1.3
 Servlet2.4  JSP2.0  JSF1.1  J2EE1.4
 Servlet2.5  JSP2.1  JSF1.2、JSF2.0  Java EE5
 Servlet3.0  JSP2.2    Java EE6

Tomcat所对应的Servlet/JSP规范和JDK版本:

Servlet/JSP Spec Apache Tomcat version Actual release revision Minimum Java Version
3.0/2.2 7.0.x 7.0.12 1.6
2.5/2.1 6.0.x 6.0.32 1.5
2.4/2.0 5.5.x 5.5.33 1.4
2.3/1.2 4.1.x (archived) 4.1.40 (archived) 1.3
2.2/1.1 3.3.x (archived) 3.3.2 (archived) 1.1

--------------------------------------------------------------------------------------------------------------------------------------------

  1. import java.io.IOException;
  2. import java.util.concurrent.CopyOnWriteArraySet;
  3.  
  4. import javax.websocket.OnClose;
  5. import javax.websocket.OnError;
  6. import javax.websocket.OnMessage;
  7. import javax.websocket.OnOpen;
  8. import javax.websocket.Session;
  9. import javax.websocket.server.ServerEndpoint;
  10.  
  11. //@ServerEndpoint("/test")
  12. @ServerEndpoint(name = "myFirstServlet",urlPatterns = {"/test"} )
  13. public class MyWebSocket {
  14.  
  15. //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  16. private static int onlineCount = 0;
  17.  
  18. //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
  19. private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();
  20.  
  21. //与某个客户端的连接会话,需要通过它来给客户端发送数据
  22. private Session session;
  23.  
  24. /**
  25. * 连接建立成功调用的方法
  26. * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
  27. */
  28. @OnOpen
  29. public void onOpen(Session session){
  30. this.session = session;
  31. webSocketSet.add(this); //加入set中
  32. addOnlineCount(); //在线数加1
  33. System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
  34. }
  35.  
  36. /**
  37. * 连接关闭调用的方法
  38. */
  39. @OnClose
  40. public void onClose(){
  41. webSocketSet.remove(this); //从set中删除
  42. subOnlineCount(); //在线数减1
  43. System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
  44. }
  45.  
  46. /**
  47. * 收到客户端消息后调用的方法
  48. * @param message 客户端发送过来的消息
  49. * @param session 可选的参数
  50. */
  51. @OnMessage
  52. public void onMessage(String message, Session session) {
  53. System.out.println("来自客户端的消息:" + message);
  54.  
  55. //群发消息
  56. for(MyWebSocket item: webSocketSet){
  57. try {
  58. item.sendMessage(message);
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. continue;
  62. }
  63. }
  64. }
  65.  
  66. /**
  67. * 发生错误时调用
  68. * @param session
  69. * @param error
  70. */
  71. @OnError
  72. public void onError(Session session, Throwable error){
  73. System.out.println("发生错误");
  74. error.printStackTrace();
  75. }
  76.  
  77. /**
  78. * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
  79. * @param message
  80. * @throws IOException
  81. */
  82. public void sendMessage(String message) throws IOException{
  83. this.session.getBasicRemote().sendText(message);
  84. //this.session.getAsyncRemote().sendText(message);
  85. }
  86.  
  87. public static synchronized int getOnlineCount() {
  88. return onlineCount;
  89. }
  90.  
  91. public static synchronized void addOnlineCount() {
  92. MyWebSocket.onlineCount++;
  93. }
  94.  
  95. public static synchronized void subOnlineCount() {
  96. MyWebSocket.onlineCount--;
  97. }
  98.  
  99. }
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <title>My WebSocket</title>
  5. </head>
  6.  
  7. <body>
  8. Welcome<br/>
  9. <input id="text" type="text" /><button onclick="send()">Send</button> <button onclick="closeWebSocket()">Close</button>
  10. <div id="message">
  11. </div>
  12. </body>
  13.  
  14. <script type="text/javascript">
  15. var websocket = null;
  16.  
  17. //判断当前浏览器是否支持WebSocket
  18. if('WebSocket' in window){
  19. websocket = new WebSocket("ws://localhost:8080/MyTest/test");
  20. }
  21. else{
  22. alert('Not support websocket')
  23. }
  24.  
  25. //连接发生错误的回调方法
  26. websocket.onerror = function(){
  27. setMessageInnerHTML("error");
  28. };
  29.  
  30. //连接成功建立的回调方法
  31. websocket.onopen = function(event){
  32. setMessageInnerHTML("open");
  33. }
  34.  
  35. //接收到消息的回调方法
  36. websocket.onmessage = function(){
  37. setMessageInnerHTML(event.data);
  38. }
  39.  
  40. //连接关闭的回调方法
  41. websocket.onclose = function(){
  42. setMessageInnerHTML("close");
  43. }
  44.  
  45. //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
  46. window.onbeforeunload = function(){
  47. websocket.close();
  48. }
  49.  
  50. //将消息显示在网页上
  51. function setMessageInnerHTML(innerHTML){
  52. document.getElementById('message').innerHTML += innerHTML + '<br/>';
  53. }
  54.  
  55. //关闭连接
  56. function closeWebSocket(){
  57. websocket.close();
  58. }
  59.  
  60. //发送消息
  61. function send(){
  62. var message = document.getElementById('text').value;
  63. websocket.send(message);
  64. }
  65. </script>
  66. </html>
[java] view plain copy

 

print?

  1. import java.io.IOException;
  2. import java.util.concurrent.CopyOnWriteArraySet;
  3. import javax.websocket.OnClose;
  4. import javax.websocket.OnError;
  5. import javax.websocket.OnMessage;
  6. import javax.websocket.OnOpen;
  7. import javax.websocket.Session;
  8. import javax.websocket.server.ServerEndpoint;
  9. @ServerEndpoint(value="/websocket")
  10. public class MyWebSocket {
  11. //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  12. private static int onlineCount = 0;
  13. //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
  14. private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();
  15. //与某个客户端的连接会话,需要通过它来给客户端发送数据
  16. private Session session;
  17. /**
  18. * 连接建立成功调用的方法
  19. * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
  20. */
  21. @OnOpen
  22. public void onOpen(Session session){
  23. this.session = session;
  24. webSocketSet.add(this);     //加入set中
  25. addOnlineCount();           //在线数加1
  26. System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
  27. }
  28. /**
  29. * 连接关闭调用的方法
  30. */
  31. @OnClose
  32. public void onClose(){
  33. webSocketSet.remove(this);  //从set中删除
  34. subOnlineCount();           //在线数减1
  35. System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
  36. }
  37. /**
  38. * 收到客户端消息后调用的方法
  39. * @param message 客户端发送过来的消息
  40. * @param session 可选的参数
  41. */
  42. @OnMessage
  43. public void onMessage(String message, Session session) {
  44. System.out.println("来自客户端的消息:" + message);
  45. //群发消息
  46. for(MyWebSocket item: webSocketSet){
  47. try {
  48. item.sendMessage(message);
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. continue;
  52. }
  53. }
  54. }
  55. /**
  56. * 发生错误时调用
  57. * @param session
  58. * @param error
  59. */
  60. @OnError
  61. public void onError(Session session, Throwable error){
  62. System.out.println("发生错误");
  63. error.printStackTrace();
  64. }
  65. /**
  66. * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
  67. * @param message
  68. * @throws IOException
  69. */
  70. public void sendMessage(String message) throws IOException{
  71. this.session.getBasicRemote().sendText(message);
  72. //this.session.getAsyncRemote().sendText(message);
  73. }
  74. public static synchronized int getOnlineCount() {
  75. return onlineCount;
  76. }
  77. public static synchronized void addOnlineCount() {
  78. MyWebSocket.onlineCount++;
  79. }
  80. public static synchronized void subOnlineCount() {
  81. MyWebSocket.onlineCount--;
  82. }
  83. }

JavaEE 7 新特性之WebSocket的更多相关文章

  1. web新特性 之 WebSocket

    详情参见:你真的了解WebSocket吗?     WebSocket系列教程   HTML5新特性之WebSocket WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HT ...

  2. HTML5新特性之WebSocket

    1.概述 HTTP协议是一种无状态协议,服务端本身不具有识别客户端的能力,必须借助外部机制,比如session和cookie,才能与特定客户端保持对话.这多多少少带来一些不便,尤其在服务器端与客户端需 ...

  3. javaee+tomcat新特性,乱码问题

    Tomcat版本问题,servlet乱码问题 我在学习的时候,老师用的是Tomcat1.7版本,在jsp发送get请求的时候,Servlet中还要对get请求传递过来的参数进行解码编码,因为tomca ...

  4. Servlet3.0新特性(从注解配置到websocket编程)

    Servlet3.0的出现是servlet史上最大的变革,其中的许多新特性大大的简化了web应用的开发,为广大劳苦的程序员减轻了压力,提高了web开发的效率.主要新特性有以下几个: 引入注解配置 支持 ...

  5. HTML5新特性 websocket(重点)--多对多聊天室

    一.html5新特性  websocket(重点)--多对多聊天室 HTTP:超文本传输协议 HTTP作用:传输网页中资源(html;css;js;image;video;..) HTTP是浏览器搬运 ...

  6. H5新特性websocket

    websocket也是html5的新增加内容之一,号称是下一代客户端/服务器异步通信办法,私以为虽然有点吹牛的成分,但是以后说不定能成为异步通信的半壁江山,至于取代ajax,我觉的应该不会. webs ...

  7. JavaEE基础(二十七)/反射、JDK新特性

    1.反射(类的加载概述和加载时机) A:类的加载概述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载  就是指将class文件读入 ...

  8. java8新特性视频、spring4.0视频讲解,javaee基础知识讲解等网址汇总

    1.http://ke.atguigu.com/     海量视频首页 2.http://ke.atguigu.com/course/56    java8新特性学习地址

  9. Tomcat学习总结(9)——Apache Tomcat 8新特性

    一.Apache Tomcat 8介绍 Apache Tomcat 8RC1版于2013年8月份发布.它 经过了2年的开发,引入了很多新特征,由于目前还只是Alpha版,故不推荐在产品中使用.但是我们 ...

随机推荐

  1. Python-Redis的Set操作

    集合为不重复的列表 无序集合 sadd(name,values):在name对应的集合中添加元素 smembers(name):获取name对应的集合的所有成员 127.0.0.1:6379> ...

  2. navicat自动备份

    http://blog.csdn.net/eastmount/article/details/70239244

  3. Java 数据类型间的相互转化

    Java中常见基本数据类型包括(String除外[引用]) Date(int year,int month,int day,int hour,int minute,int sec); String 格 ...

  4. Convolutional Neural Networks 笔记

    1 Foundations of Convolutional Neural Networks 1.1 cv问题 图像分类.目标检测.风格转换.但是高像素的图片会带来许多许多的特征. 1.2 边缘检测( ...

  5. Redis简介及基础知识

    一.Redis简介 Redis是什么?两句话可以做下概括: 1. 是一个完全开源免费的key-value内存数据库 2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 string( ...

  6. 牛叉之nc命令

    nc是一款很不错的网络检测工具,以下是详细使用. 'nc.exe -h'即可看到各参数的使用方法. 基本格式:nc [-options] hostname port [ports] - nc -l - ...

  7. Java基础——深入剖析Java中的装箱和拆箱

    (转自:http://www.cnblogs.com/dolphin0520/p/3780005.html) 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若 ...

  8. vue-cli目录结构及说明

    使用vue-cli有时会出现一些莫名的问题,清楚项目的结构文件及其意义方便更好的开发和解决问题,介绍如下: build/ // 项目构建(webpack)相关代码 build.js // 生产环境构建 ...

  9. CodeForces 106C 【DP】

    题意: n g dough  m种商品? 每种有ai stuffing, 拿bi stuffing + ci dough -> di tugriks rest c0 dough -> d0 ...

  10. go语言实战教程:实战项目资源导入和项目框架搭建

    从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...