Java 与 JavaScript 对websocket的使用

ebsocket,HTML5中新一代全双工通信协议。其底层仍然是http协议。

传统 HTTP 请求响应客户端服务器交互图

WebSocket 请求响应客户端服务器交互图

 

 

WebSocket 客户端支持
浏览器 支持情况
Chrome Chrome version 4+支持
Firefox Firefox version 5+支持
IE IE version 10+支持
Safari IOS 5+支持
Android Brower Android 4.5+支持

webSocket消息推送例子

 

Java后端

pom.xml

 

[javascript] view plain copy

 

 print?

  1. <!-- webSocket -->  
  2. <dependency>  
  3.     <groupId>javax</groupId>  
  4.     <artifactId>javaee-api</artifactId>  
  5.     <version>7.0</version>  
  6. </dependency>  

 


 

(tomcat7.027开始支持websocket,但是tomcat7.047开始才能使用注解形式的websoket,从该版本开始websoket被集成进入了javaee7中)

 

java代码:

 

[java] view plain copy

 
 print?

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

JSP页面

 

 

[html] view plain copy

 

 print?

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  6. <title>websocket</title>  
  7. </head>  
  8. <body>  
  9.     Welcome<br/>  
  10.     <input id="text" type="text"/>  
  11.         <button onclick="send()">发送消息</button>  
  12.         <hr/>       
  13.         <button onclick="closeWebSocket()">关闭WebSocket连接</button>  
  14.         <hr/>  
  15.         <div id="message"></div>  
  16.   <script type="text/javascript">  
  17.     var websocket = null;  
  18.        //判断当前浏览器是否支持WebSocket  
  19.        if ('WebSocket' in window) {  
  20.           websocket = new WebSocket("ws://localhost:8028/ThesisManage/websocket");  
  21.       }  
  22.       else {  
  23.           alert('当前浏览器 Not support websocket')  
  24.       }  
  25.      
  26.       //连接发生错误的回调方法  
  27.       websocket.onerror = function () {  
  28.            setMessageInnerHTML("WebSocket连接发生错误");  
  29.       };  
  30.      
  31.        //连接成功建立的回调方法  
  32.        websocket.onopen = function () {  
  33.            setMessageInnerHTML("WebSocket连接成功");  
  34.        }  
  35.      
  36.       //接收到消息的回调方法  
  37.        websocket.onmessage = function (event) {  
  38.            setMessageInnerHTML(event.data);  
  39.       }  
  40.     
  41.        //连接关闭的回调方法  
  42.        websocket.onclose = function () {  
  43.           setMessageInnerHTML("WebSocket连接关闭");  
  44.        }  
  45.      
  46.        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
  47.        window.onbeforeunload = function () {  
  48.            closeWebSocket();  
  49.        }  
  50.      
  51.        //将消息显示在网页上  
  52.        function setMessageInnerHTML(innerHTML) {  
  53.           document.getElementById('message').innerHTML += innerHTML + '<br/>';  
  54.       }  
  55.      
  56.       //关闭WebSocket连接  
  57.        function closeWebSocket() {  
  58.            websocket.close();  
  59.        }  
  60.     
  61.        //发送消息  
  62.        function send() {  
  63.           var message = document.getElementById('text').value;  
  64.           websocket.send(message);  
  65.        }  
  66.   </script>  
  67. </body>  
  68. </html>  

页面效果:

 

 

时间: 2024-11-05 21:55:40

Java 与 JavaScript 对websocket的使用的相关文章

java与javascript有没有沟通的方法

问题描述 java与javascript有没有沟通的方法 用java写的界面,中途要调用百度地图api,相应的开发有javascript的不知道怎么在这两种语言建立数据沟通 解决方案 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20731447&id=1883655 解决方案二: 有没有最简单的xml转换java类的方法 解决方案三: 需要使用http或者websocket进行沟通: http可以发起get和post请求,

Android中WebView载入本地HTML代码并实现Java与JavaScript交互的例子

正在开发一个地图程序, 相对于用XML写安卓界面, 我更愿意用这个偷懒的办法,就是不用Android自带的MapView, 而是使用之前就已经比较熟悉的Google Maps JavaScript API, 在Android的WebView中载入HTML代码, 利用Android提供的强大的Java与Js的交互功能,用网页作为界面来开发程序,同时也可以用Js回调机器的本地功能比如GPS等. 下面提供一个演示的例子,代码如下: 1package com.aloong.map; 2 3import 

Java和JavaScript中使用Json方法大全

[本文转载于 Java和JavaScript中使用Json方法大全 ] 摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率). 一.准备工作      

从Java和JavaScript来学习Haskell和Groovy

我记得刚接触计算机的时候,我就受到了两个非常巨大的错误观念的影响,这个观念最初是来自于老师的传授还是学长的教诲已经记不清了,但是直到我工作几年以后,才慢慢有了实际的体会: 学习和使用什么编程语言不重要,重要的是算法和设计: 程序员学习的精髓是面向对象的设计模式,掌握以后,一通百通. 简直就是是胡扯啊.也许在某个极其狭隘的上下文中还能这样说,但是泛泛而谈,这样的态度无疑是误人子弟的. 就说第一条,编程语言不但重要,而且太重要了.换句话说,学习一门新的编程语言,可能学习的是背后的范型和思考问题的方式

比较全面的C 、Java、JavaScript中的正则表达式详解_正则表达式

什么是正则表达式? 正则表达式(Regular Expression) 就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗 * 浩":那么"罗 * 浩"就是公式,也称作 模式(Pattern) ,这篇文章就是 要匹配的串( 或叫文本 text) .再如,你要检查输入的一个字符串是否是 126 邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开

java和javascript获取word文档的书签位置对比_javascript技巧

1.javascript:把IE浏览器的activex都打开,使用如下网页,可以看到书签顺序和位置: <html> <head> <script> var word; word = new ActiveXObject("Word.Application"); var range = word.Range; word.Visible = true; var path = "D:\\xxx\\xxx\\xx.doc"; word.Do

java和javascript中过滤掉img形式的字符串不显示图片的方法_java

本文实例讲述了java和javascript中过滤掉img形式的字符串不显示图片的方法.分享给大家供大家参考.具体实现方法如下: 1. javascript过滤掉<img></img>和<img />形式的字符串 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml

Java 和 JavaScript 真正通用的Base64编码详解_java

 Java 和 JavaScript Base64编码 在开发Java  Web应用的时候,可能会在服务器端用Java做Base64编码,而在客户端用JavaScript进行解码.这样就要求两边的Base64编码机制保持一致. 使用Base64编码,可能会碰到各种奇怪情况,甚至怀疑编码有bug.但实际上不是这样的.Base64理论上操作的对象不是字符串而是字节数组.它的原理就是把ASCII码的255个字符缩小到用64个来表示.具体就是原来三个字节用四个字节表示,编码后长度有一定的增长. 1) 最

java和JavaScript究竟什么关系,有什么样的区别

犹记得刚刚接触Java的时候,有一天突然看见了JavaScript,第一反应就是:这是什么?跟Java这么像,莫非它俩之间有什么不可告人的关系?        这就得从他们诞生时开始说起:       1994年的时候,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力.因此,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动.1995年Sun公司将Oak语言改名为J