开发环境:

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

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

import java.io.IOException;
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("/test")
@ServerEndpoint(name = "myFirstServlet",urlPatterns = {"/test"} )
public class MyWebSocket { //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session; /**
* 连接建立成功调用的方法
* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(Session session){
this.session = session;
webSocketSet.add(this); //加入set中
addOnlineCount(); //在线数加1
System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
} /**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(){
webSocketSet.remove(this); //从set中删除
subOnlineCount(); //在线数减1
System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
} /**
* 收到客户端消息后调用的方法
* @param message 客户端发送过来的消息
* @param session 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("来自客户端的消息:" + message); //群发消息
for(MyWebSocket item: webSocketSet){
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
} /**
* 发生错误时调用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error){
System.out.println("发生错误");
error.printStackTrace();
} /**
* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException{
this.session.getBasicRemote().sendText(message);
//this.session.getAsyncRemote().sendText(message);
} public static synchronized int getOnlineCount() {
return onlineCount;
} public static synchronized void addOnlineCount() {
MyWebSocket.onlineCount++;
} public static synchronized void subOnlineCount() {
MyWebSocket.onlineCount--;
} }
<!DOCTYPE HTML>
<html>
<head>
<title>My WebSocket</title>
</head> <body>
Welcome<br/>
<input id="text" type="text" /><button onclick="send()">Send</button> <button onclick="closeWebSocket()">Close</button>
<div id="message">
</div>
</body> <script type="text/javascript">
var websocket = null; //判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
websocket = new WebSocket("ws://localhost:8080/MyTest/test");
}
else{
alert('Not support websocket')
} //连接发生错误的回调方法
websocket.onerror = function(){
setMessageInnerHTML("error");
}; //连接成功建立的回调方法
websocket.onopen = function(event){
setMessageInnerHTML("open");
} //接收到消息的回调方法
websocket.onmessage = function(){
setMessageInnerHTML(event.data);
} //连接关闭的回调方法
websocket.onclose = function(){
setMessageInnerHTML("close");
} //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function(){
websocket.close();
} //将消息显示在网页上
function setMessageInnerHTML(innerHTML){
document.getElementById('message').innerHTML += innerHTML + '<br/>';
} //关闭连接
function closeWebSocket(){
websocket.close();
} //发送消息
function send(){
var message = document.getElementById('text').value;
websocket.send(message);
}
</script>
</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. netty中的Channel、ChannelPipeline

    一.Channel与ChannelPipeline关系 每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline.这项关联是永久性 的:Channel 既不能附加另外一个 ...

  2. BackgroundWorker 控件

    BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作.耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停 ...

  3. delphi 线程教学第二节:在线程时空中操作界面(UI)

    第二节:在线程时空中操作界面(UI)   1.为什么要用 TThread ?   TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...

  4. content-disposition attachment filename 在Firefox和IE中得到不同的结果

    在Firefox中需要把filename 用双引号包起来,才能得到想要的名字,不然如果含有空格,会丢掉空格后面的部分.而IE会把空格转为_,因此也需要HttpUtility.UrlPathEncode ...

  5. linux日常管理-rsync_ssh方式

    现在我们有两台机器,两台机器都需要安装rsync    yum -y install rsync       一台的主机名是wangshaojun IP是192.168.1.117 ,另一台的主机名是 ...

  6. Linux下统计代码行数

    使用wc统计代码行数 最近写了一些代码,想统计一下代码的行数,在eclipse中好像没这功能,网上搜了一下才发现原来Linux有一个统计文件行数的命令wc.使用wc可以打印出每个文件和总文件的行数.字 ...

  7. python fabric的安装与使用

    背景:fabric主要执行远程的shell命令,包括文件的上传.下载,以及提示用户输入等辅助其它功能. 测试系统:ubuntu16 要求:python //系统有自带,ubuntu16 通常自带pyt ...

  8. 安装yum在ubnutu上

    安装yum在ubnutu上1:首先检测是否安装了build-essential程序包 apt-get install build-essential2.安装yumapt-get install yum ...

  9. hdu1080

    #include<iostream> using namespace std; char s1[105],s2[105]; int val[5][5]={ {5,-1,-2,-1,-3}, ...

  10. 2018CCPC网络赛A(优先队列,思维)

    #include<bits/stdc++.h>using namespace std;priority_queue<pair<int,int>>q;int main ...