Java 与 JavaScript 对websocket的使用

时间:2022-05-03
本文章向大家介绍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>  

页面效果: