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 条评论
登录 后参与评论

相关文章

来自专栏Java后端生活

JavaWeb(五)Servlet-2

1756
来自专栏Java3y

Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】

什么是会话技术 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们...

2985
来自专栏ASP.NETCore

WebSocket in ASP.NET Core

  WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)

612
来自专栏恰同学骚年

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此...

1123
来自专栏Python爬虫与算法进阶

使用scrapy发送post请求的坑

Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,你可以这样发送一个 HTTP POST 请求:

2412
来自专栏PHP技术

PHP输入流php://input介绍

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php:...

3255
来自专栏自动化测试实战

Flask第二篇——服务器相关

2758
来自专栏阿杜的世界

Servlet请求和响应

在Java Web中Servlet、请求和响应是最基本的三个对象,在Web容器的管理下,这三者能够完成基本的HTTP请求处理。

603
来自专栏python学习指南

python爬虫(五)_urllib2:Get请求和Post请求

本篇将介绍urllib2的Get和Post方法,更多内容请参考:python学习指南 urllib2默认只支持HTTP/HTTPS的GET和POST方法 ...

3096
来自专栏java思维导图

http超文本协议,让http不再难懂

先来个导图,再来分解: ? 导图详情: 协议 HyperText Transfer Protocol,超文本传输协议 一个无状态的请求/响应协议 是因特网上应...

2917

扫码关注云+社区