WebSocket基于javaweb+tomcat的简易demo程序

由于项目需要,前端向后台发起请求后,后台需要分成多个步骤进行相关操作,而且不能确定各步骤完成所需要的时间

倘若使用ajax重复访问后台以获取实时数据,显然不合适,无论是对客户端,还是服务端的资源很是浪费

这种情况下,WebSocket能够解决此问题

它不像普通的http请求或者ajax访问,返回相应的结果就关闭了连接

WebSocket在个人浅薄的知识看来是属于长连接,能保持连接,随时收发数据

所以对WebSocket进行了初步了解,并按照相关的教程尝试做了一个简易demo

首先需要了解的是,WebSocket的几个基本操作

  1. 客户端开启连接
  2. 客户端给服务器发送数据
  3. 服务器接收数据
  4. 服务器给客户端发送数据
  5. 客户端接收数据

其中,服务端和客户端都能监听三类基本事件:

1、onopen(打开连接) 2、onmessage(发送数据) 3、onclose(关闭连接)

本次的demo中使用了tomcat7.0作为服务端,据悉7.0以上的版本才支持WebSocket

首先使用eclipse创建一个web project

在工程根目录下的WEB-INF/lib目录中导入tomcat7.0的lib文件夹中的 tomcat7-websocket.jar 和 websocket-api.jar

然后在src目录下创建第一个类(重点在于继承ServerApplicationConfig)

package cn.test.websocket;

import java.util.Set;

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;

public class ApplicationConfig implements ServerApplicationConfig {

    //扫描注解
    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scan) {
        System.out.println("scan WebSocket" + scan.size());
        //返回(起到过滤的作用,可以在返回前把里面部分类进行过滤)
        return scan;
    }

    //实现接口
    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(
            Set<Class<? extends Endpoint>> arg0) {
        // TODO Auto-generated method stub
        return null;
    }

}

接着创建第二个类,这个类用来处理WebSocket传送过来的数据(重点在于该类有@ServerEndpoint的注解)

package cn.test.websocket;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

//注解规定了访问的URL
@ServerEndpoint("/echo")
public class EchoSocket {
    /**
     * 客户端有连接的时候就会调用这个方法
     */
    @OnOpen
    public void open(Session session){

        System.out.println(session.getId()+"#############");
    }
    /**
     * 客户端连接断开就会调用此方法
     */
    @OnClose
    public void close(Session session){
        System.out.println(session.getId() + "连接关闭了");
    }

    /**
     * 接收到客户端的信息
     * @param msg
     * @param last
     */
    @OnMessage
    public void message(Session session,String msg,boolean last){
        System.out.println("客户端说" + msg);
        try {
            session.getBasicRemote().sendText("ni hao too");
            Thread.sleep(3000);//三秒后再发送一条信息,用于验证是否实现数据实时更新
            session.getBasicRemote().sendText("ni hao too twice");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public EchoSocket(){
        System.out.println("Socket对象创建");
        //通过对象的创建可以知道不同socket之间的通信不会共享成员变量
    }
}

本案例中,使用的是基于注解的方法,让ApplicationConfig扫描注解

(实际上还有实现接口实现的方法,同理可以让ApplicationConfig扫描实现接口的类)

后台所需的类已经写好了,接下来就写一个简单的jsp页面

在工程下的index.jsp如下(实际上html也可以)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>WebSocket示例</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="description" content="This is my page">
  </head>

  <body>
      <button onclick="subOpen();">open</button><br/>
      <input type="text" name="msg" id="msg"><br/>
      <button onclick="send();">发送</button>
      <div id="div"></div>

  </body>

  <script type="text/javascript">
      var ws; // 就是一个通信管道
      var target = "ws://127.0.0.1:8080/WebSocket/echo";//服务端的url,注意以ws开头
      function subOpen(){
          //三个判断用于获取ws通信管道(浏览器兼容)
          if(‘WebSocket‘ in window){
              ws = new WebSocket(target);
          }else if(‘MozWebSocket‘ in window){
              ws = new MozMozWebSocket(target);
          }else{
              alert("WebSocket is not supported by this browse");
              return;
          }
          //ws.onopen = function(){}  链接开启会执行方法
          //ws.onclose = function(){}  断开连接会执行方法
          //以上两个实际用处并不多,主要是下面的
          //服务器又信息返回就执行方法
          ws.onmessage=function(event){
              //服务端一返回内容,就把该内容放到div标签当中
              document.getElementById("div").innerHTML = event.data;

              //方便在控制台查看返回内容的具体信息
              console.info(event);
          };
      };

      function send(){
          //点击发送按钮就把输入框里的内容发送给服务器,并把输入框的内容清空
          var msg = document.getElementById("msg").value;
          ws.send(msg);
          document.getElementById("msg").value = "";
      };

  </script>

</html>

至此,demo已经编写完毕,将工程部署到tomcat7.0,启动tomcat并访问localhost:8080/WebSocket可看到以下简易页面





点击open按钮,发起websocket连接,服务端控制台会输出

Socket对象创建
0#############

在网页输入框输入“你好”后点击“发送”按钮

服务端控制台输出

客户端说你好

网页端先显示"ni hao too",三秒后,又显示"ni hao too twice"

(三秒钟太短了懒得去截第一个效果的图片的,反正大家都懂的2333)





重复再网页输入信息点击发送后能重复展现同样的效果

显然,WebSocket非常灵活好用

(ps:第一篇随笔です,新人初来乍到,难免会有很多缺漏或者错误的地方,还请前辈们多多指点)

时间: 2024-10-27 12:12:40

WebSocket基于javaweb+tomcat的简易demo程序的相关文章

基于C# Winform的简易聊天程序[第一篇-两端通信]

程序简介 本聊天程序支持局域网内部客户端与服务端之间的互相通信. 原理 启动服务端后,服务端通过持续监听客户端发来的请求,一旦监听到客户端传来的信息后,两端便可以互发信息了.服务端需要绑定一个IP,用于客户端在网络中寻找并建立连接.信息发送原理:将手动输入字符串信息转换成机器可以识别的字节数组,然后调用套接字的Send()方法将字节数组发送出去.信息接收原理:调用套接字的Receive()方法,获取对端传来的字节数组,然后将其转换成人可以读懂的字符串信息. 界面设计 - 服务端 IP文本框 na

Nancy之基于Nancy.Owin的小Demo

前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katana 什么是Owin呢? 官网地址:http://owin.org OWIN在.NET Web Servers与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application. 什么是Katana呢? 官网地址:http://kata

基于Apache+Tomcat负载均衡的两种实现方法

Apache+Tomcat实现负载均衡的两种实现方法 如果我们将工作在不同平台的apache能够实现彼此间的高效通信,因此它需要一种底层机制来实现--叫做apr Apr的主要目的就是为了其能够让apache工作在不同的平台上,但在linux上安装apache的时候通常都是默认安装的 [[email protected] ~]#rpm -qi aprName                 :apr                                        Relocation

RCF进程间通信Demo程序

在上一篇文章RPC通信框架--RCF介绍中,介绍了RCF的优点,本篇文章从头开始演示如何用RCF编写一个跨进程通信的Demo程序. 将RCF编译为静态库 从官网下载到的源码中包含一个RCF的项目,但是这项目是用来编译动态库的.可以参考这个项目来进行静态库的设置. 首先创建一个空的项目文件,然后设置编译为静态库,添加源文件RCF.cpp,只需要这一个文件就够了,因为,这个文件里面,包含了其他所有的源文件.这种源代码的引用方式,编译为动态库,还可以接受,但是编译为静态库就会有一些问题,后面的文章中再

osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo

生命周期中关键3个类: BundleActivator 入口点,类似main方法 BundleContext Bundle上下文对象,在运行期间,为应用程序提供操作osgi框架的方法 Bundle 代表一个已安装的Bundle 接口说明: BundleActivator: public interface BundleActivator { public void start(BundleContext context) throws Exception; public void stop(Bu

基于arduino+web的物联网demo,web和微信控制

视频效果: 基于arduino+web的物联网demo,web和微信控制 基于arduino + web的物联网demo,实现了web和微信的多方式控制,折腾了好几周,终于完美解决了. 配件清单: Arduino uno3(主板) HLK-RM04(Uart串口转Wifi) 主板程序源码: String strs = ""; int led = 6; void setup() {    pinMode(led, OUTPUT);   Serial.begin(115200);//设置串

【开源下载】基于TCP网络通信的自动升级程序c#源码

本程序使用开源的来自英国的networkcomms2.3.1网络通讯框架(c#语言编写) [http://www.networkcomms.net] 使用networkcomms框架作为工作中的主要编程框架1年多的时间了,networkcomms的有优美.稳定深深打动了我,基于此框架开发了不少程序,特别的稳定. networkcomms框架由英国剑桥的2位工程师开发,支持.net2.0以上平台,原生态的支持xamarion.android(安卓),xamarin.ios,以及蓝牙等多平台开发.

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 推荐 前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文). 本文将演示的是一个基于Netty4的UDP服