开发环境:

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. @JsonProperty 注解

    是Jackson注解.fastjson有可以用. 作用在字段或方法上,用来对属性的序列化/反序列化,可以用来避免遗漏属性,同时提供对属性名称重命名,比如在很多场景下Java对象的属性是按照规范的驼峰书 ...

  2. LInux在线安装JDK

    1.查找Java相关列表: [root@localhost ~]# yum -y list java* 2.使用root用户安装安装时提醒必须使用root用户,sudo都不行. [root@local ...

  3. 菜鸟学Nhibernate 之路---(1)

    首先说一下我为什么要学这个Nhibernate,现在在公司做项目后台的逻辑层都是用动软生成的简单三层,搞来搞去都是这些东西,代码冗余量很大,每个类方法基本上都一样,真是纯正的码农,虽然后来我也尝试使用 ...

  4. 基于OpenCV之视频读取,处理和显示框架的搭建(一)

    主要包括以下内容: 1.使用的主要函数的说明. 2.两个实例:视频读取和显示.搭建视频读取和处理框架,调用canny函数提取边缘并显示. 3.一些注意事项和代码说明. 一.使用的主要函数 1.延时函数 ...

  5. SQL查询语句大全集锦

    SQL查询语句大全集锦 一. 简单查询 简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的 表或视图.以及搜索条件等. 例如,下面的语句查询t ...

  6. elasticsearch2.x插件之一:bigdesk

    bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索引数据.搜索情况,http连接数等. 可用项目git地址:https:// ...

  7. assert.fail()

    assert.fail(message) assert.fail(actual, expected[, message[, operator[, stackStartFunction]]]) oper ...

  8. mac下已装virtualbox运行genymotion还报错找不到虚拟机的解决办法

    sudo ln -s /usr/local/bin/VBoxManage /usr/bin/VBoxManage  

  9. 《精通Spring4.X企业应用开发实战》读后感第七章(AOP概念)

  10. JS中apply和call的用法

    JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 先来看看JS手册中对call的解释: call 方法调用一个对象的一个方法,以另一个对象替换当前对象. cal ...