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

<!-- webSocket -->  
<dependency>  
    <groupId>javax</groupId>  
    <artifactId>javaee-api</artifactId>  
    <version>7.0</version>  
</dependency> 

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

java代码:

package com.student.system.listen;  
 
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("/websocket")  
public class WebSocketListen {  
 
 // 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。  
 private static int onlineCount = 0;  
 
 // concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识  
 private static CopyOnWriteArraySet<WebSocketListen> webSocketSet = new CopyOnWriteArraySet<WebSocketListen>();  
 
 // 与某个客户端的连接会话,需要通过它来给客户端发送数据  
 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 (WebSocketListen 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() {  
        WebSocketListen.onlineCount++;  
    }  
 
 public static synchronized void subOnlineCount() {  
        WebSocketListen.onlineCount--;  
    }  
}  

JSP页面

<%@ page language="java" contentType="text/html; charset=UTF-8"  
 pageEncoding="UTF-8"%>  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>websocket</title>  
</head>  
<body>  
    Welcome<br/>  
 <input id="text" type="text"/>  
 <button onclick="send()">发送消息</button>  
 <hr/>       
 <button onclick="closeWebSocket()">关闭WebSocket连接</button>  
 <hr/>  
 <div id="message"></div>  
 <script type="text/javascript">  
    var websocket = null;  
       //判断当前浏览器是否支持WebSocket  
       if ('WebSocket' in window) {  
 websocket = new WebSocket("ws://localhost:8028/ThesisManage/websocket");  
      }  
      else {  
          alert('当前浏览器 Not support websocket')  
      }  
 
      //连接发生错误的回调方法  
 websocket.onerror = function () {  
           setMessageInnerHTML("WebSocket连接发生错误");  
      };  
 
       //连接成功建立的回调方法  
 websocket.onopen = function () {  
           setMessageInnerHTML("WebSocket连接成功");  
       }  
 
      //接收到消息的回调方法  
 websocket.onmessage = function (event) {  
           setMessageInnerHTML(event.data);  
      }  
 
       //连接关闭的回调方法  
 websocket.onclose = function () {  
          setMessageInnerHTML("WebSocket连接关闭");  
       }  
 
       //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
 window.onbeforeunload = function () {  
           closeWebSocket();  
       }  
 
       //将消息显示在网页上  
       function setMessageInnerHTML(innerHTML) {  
          document.getElementById('message').innerHTML += innerHTML + '<br/>';  
      }  
 
      //关闭WebSocket连接  
       function closeWebSocket() {  
           websocket.close();  
       }  
 
       //发送消息  
       function send() {  
          var message = document.getElementById('text').value;  
          websocket.send(message);  
       }  
 </script>  
</body>  
</html>  

页面效果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和未来有约会

建立可扩展的silverlight 应用框架 step-4

通过外部配置文件加载模块module 在上一节中为项目引入了“Prism”框架,并建立了一个Hello Prism做测试。这里要把项目好好的整理一下。使其更...

1695
来自专栏闻道于事

SpringBoot常用配置

前言:springboot集成了主流的第三方框架,但是需要使用springboot那一套配置方式。但是我这里只列举了非常非常常用的,可以看已发的几篇博客,慢慢会...

4237
来自专栏前端杂谈

vue-roter2 路由传参

862
来自专栏流柯技术学院

查看Android应用包名、Activity的几个方法

直接打开AndroidManifest.xml文件,找到包含android.intent.action.MAIN和android.intent.category...

642
来自专栏大数据

使用Go构建一个Data Thrashing CLI工具

以下所撰就是这个快速上手的项目。最后,我将在容器中搭建服务,并将其放入Kubernetes(k8s)集群中,不过下面操作都是在CLI环境下进行的。

1890
来自专栏python学习之旅

Python笔记(一):安装+爬虫环境配置+打包为EXE文件

1、     安装 https://www.python.org/downloads/windows/ 到官网下载安装程序 Windows x86      ...

38710
来自专栏Python攻城狮

Python网络爬虫(五)- Requests和Beautiful Soup1.简介2.安装3.基本请求方式5.程序中的使用4.BeautifulSoup4

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,...

554
来自专栏我的博客

Mysql的控制台导入、导出

今天在往数据库里面导入.sql文件时,发现大的文件根本没办法直接导入的。通过百度,在网上找到了两种解决办法,现在和大家分享一下吧! 第一种: 一,修改PHPMy...

2575
来自专栏Jerry的SAP技术分享

Java Web项目,Android和微信小程序的初始页面配置

我们在Eclipse里开了Java Web项目之后,Run As Tomcat或者Apache服务器,本地运行,如果直接用http://localhost:80...

691
来自专栏SDNLAB

ONOS二次开发——Netconf命令下发

最近对onos进行了二次开发,主要实现了Juniper路由器的 driver开发。在Driver中利用NETCONF协议读取并修改路由器配置、生成NETCONF...

3255

扫描关注云+社区