Apache Tomcat Websocket 教程

2023-11-08

WebSocket 是一种计算机通信协议,旨在在 Web 浏览器和 Web 服务器中实现,但它可以被任何客户端或服务器应用程序使用。
 
WebSocket 协议是一个独立的基于 TCP 的协议。它与 HTTP 的唯一关系是它的握手被 HTTP 服务器解释为升级请求。WebSocket 协议使浏览器和 Web 服务器之间的更多交互成为可能,从而促进了从服务器到服务器的实时数据传输。

这是通过为服务器提供一种无需客户端请求即可向浏览器发送内容的标准化方式,并允许在保持连接打开的同时来回传递消息来实现的。通过这种方式,可以在浏览器和服务器之间进行双向(双向)正在进行的对话。通信通过 TCP 端口号 80 完成,这对于使用防火墙阻止非 Web Internet 连接的环境很有用。

目前大多数主流浏览器都支持 WebSocket 协议,包括 Google Chrome、Microsoft Edge、Internet Explorer、Firefox、Safari 和 Opera。WebSocket 还需要服务器上的 Web 应用程序来支持它。

1. 工具

  • Java JDK
  • Eclipse集成开发环境
  • Apache Tomcat

2. 介绍

在本例中,我们将向您展示如何使用 Apache Tomcat 建立客户端服务器 WebSocket 连接。我们将编写一个简单的 echo 客户端服务器应用程序并将其部署在 Tomcat 上。

3. 先决条件

  • 安装了JDK
  • 安装了 Eclipse

4.下载Tomcat

转到页面https://tomcat.apache.org/download-80.cgi并下载 tomcat 服务器作为 windows 的 zip 压缩文件。

1 下载适用于 Windows 的 Tomcat

1 下载适用于 Windows 的 Tomcat

5、Tomcat安装

5.1 解压Apache Tomcat

选择一个安装目录,将Tomcat服务器解压到自己的目录下。

4 解压Tomcat

2 解压Tomcat

5.2 安装Tomcat服务

打开Windows终端,进入Tomcat安装bin目录。

tomcat安装目录

1
C:\Java\Apache Tomcat 8.0.15\bin>

使用以下命令安装服务:

安装Tomcat服务

1
C:\Java\Apache Tomcat 8.0.15\bin>service install

你应该得到类似这样的输出:

安装Tomcat输出

1
2
3
4
5
6
7
Installing the service 'Tomcat8' ...
Using CATALINA_HOME:    "C:\Java\Apache Tomcat 8.0.15"
Using CATALINA_BASE:    "C:\Java\Apache Tomcat 8.0.15"
Using JAVA_HOME:        "C:\Java\jdk1.8.0_40"
Using JRE_HOME:         "C:\Java\jre1.8.0_40"
Using JVM:              "C:\Java\jre1.8.0_40\bin\client\jvm.dll"
The service 'Tomcat8' has been installed.

5.3 启动Tomcat服务

使用以下命令启动服务:

启动tomcat输出

1
C:\Java\Apache Tomcat 8.0.15\bin>sc start Tomcat8

您应该得到类似于以下内容的输出:

安慰

01
02
03
04
05
06
07
08
09
10
SERVICE_NAME: Tomcat8
        TYPE               : 10  WIN32_OWN_PROCESS
        STATUS             : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_OUTPUT_CODE  : 0  (0x0)
        SERVICE_OUTPUT_CODE: 0  (0x0)
        CHECK-POINT        : 0x0
        START-INDICATOR    : 0x7d0
        PID                : 5552
        MARKS              :

5.4 检查tomcat是否正在运行

在 URL 中打开浏览器:  http://localhost:8080  ,您应该会看到 Tomcat 欢迎屏幕。

5 Tomcat 欢迎

3 Tomcat 欢迎

6. 创建网络套接字服务器

我们将创建一个新的 WebSocket 服务器,打开 eclipse 并从菜单中创建一个新的动态 Web 应用程序。

6.1 创建项目

04-new-web-project

04-new-web-project

命名应用程序并按完成。

05-命名项目

05-命名项目

右键单击项目菜单创建一个新类。

06-新班

06-新班

为班级命名并按完成。

07-name-class

07-name-class

6.2 对服务器进行编码

对类进行注释

1
2
@ServerEndpoint("/websocketendpoint")
public class WsServer {

这个类级别的注释声明它装饰的类是一个 Web 套接字端点,它将被部署并在 Web 套接字服务器的 URI 空间中可用。注释允许开发人员定义将发布此端点的 URL。
服务器端点类是用 javax.websocket.server.ServerEndpoint 注释的普通旧 Java 对象。

打开 WebSocket

1
2
3
4
@OnOpen
public void onOpen(){
    System.out.println("Open Connection ...");
}

@OnOpen注解用于 @ServerEndpoint 方法,但每个端点仅使用一次。它用于装饰一个被调用的方法,一旦新连接建立。

关闭 WebSocket

1
2
3
4
@OnClose
public void onClose(){
    System.out.println("Close Connection ...");
}

@OnClose注解用于 @ServerEndpoint 方法,但每个端点仅使用一次。它用于装饰一个被调用的方法,一旦连接被关闭。

接收并回显客户端消息

1
2
3
4
5
6
@OnMessage
public String onMessage(String message){
    System.out.println("Message from the client: " + message);
    String echoMsg = "Echo from the server : " + message;
    return echoMsg;
}

@OnMessage注解用于 @ServerEndpoint 方法,但每个端点仅使用一次。它用于装饰一个被调用的方法,一旦收到新消息。

捕获错误

1
2
3
4
@OnError
public void onError(Throwable e){
    e.printStackTrace();
}

@OnError注解用于 @ServerEndpoint 方法,但每个端点仅使用一次。它用于装饰被调用的方法,一旦任何用@OnOpen、@OnMessage 和@OnClose 注释的方法抛出异常。

6.3 创建客户端

右键单击项目并选择新建 HTML 文件。

08-create-the-client-html-file

08-create-the-client-html-file

写下 HTML 文件的名称,然后单击完成。

9-命名客户

9-命名客户

6.4 HTML 客户端

表格

1
2
3
4
5
<form>
    <input id="message" type="text">
    <input onclick="wsSendMessage();" value="Echo" type="button">
    <input onclick="wsCloseConnection();" value="Disconnect" type="button">
</form>

这个表单有一个输入文本来写我们要发送到服务器的消息。发送消息的按钮和关闭连接的按钮。

xml

1
<textarea id="echoText" rows="5" cols="30"></textarea>

在此文本区域中,我们将写入来自服务器的回声。

6.5 Javascript 代码

网络套接字

1
var webSocket = new WebSocket("ws://localhost:8080/WebSocketServerExample/websocketendpoint");

打开网络套接字连接。

HTML 元素

1
2
3
var echoText = document.getElementById("echoText");
echoText.value = "";
var message = document.getElementById("message");

获取 HTML 元素。

功能

1
2
3
4
webSocket.onopen = function(message){ wsOpen(message);};
webSocket.onmessage = function(message){ wsGetMessage(message);};
webSocket.onclose = function(message){ wsClose(message);};
webSocket.onerror = function(message){ wsError(message);};

将函数分配给我们之前创建的 webSocket。

打开

1
2
3
function wsOpen(message){
    echoText.value += "Connected ... \n";
}

当我们打开页面时,文本“已连接”被写入文本区域。

发信息

1
2
3
4
5
function wsSendMessage(){
    webSocket.send(message.value);
    echoText.value += "Message sended to the server : " + message.value + "\n";
    message.value = "";
}

单击按钮回显时,将调用此函数,并使用文本框的值作为参数调用 Web 套接字类的 send 方法。
我们也写入文本区域。

1
2
3
function wsCloseConnection(){
    webSocket.close();
}

关闭 WebSocket 连接。

回复

1
2
3
function wsGetMessage(message){
    echoText.value += "Message received from to the server : " + message.data + "\n";
}

从服务器获取 WebSocket 消息并将其发送到文本区域。

关闭事件

1
2
3
function wsClose(message){
    echoText.value += "Disconnect ... \n";
}

捕获关闭事件并将消息写入文本区域。

错误

1
2
3
function wsError(message){
    echoText.value += "Error ... \n";
}

如果我们遇到任何错误,我们会将它们写入文本区域。

7.完整的源代码

7.1 服务器

爪哇

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

package server.ws;

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

@ServerEndpoint("/websocketendpoint")


public class WsServer {
    
    @OnOpen
    public void onOpen(){
        System.out.println("Open Connection ...");
    }
    
    @OnClose
    public void onClose(){
        System.out.println("Close Connection ...");
    }
    
    @OnMessage
    public String onMessage(String message){
        System.out.println("Message from the client: " + message);
        String echoMsg = "Echo from the server : " + message;
        return echoMsg;
    }

    @OnError
    public void onError(Throwable e){
        e.printStackTrace();
    }

}

7.2 客户端

xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Tomcat WebSocket</title>
</head>
<body>
    <form>
        <input id="message" type="text">
        <input οnclick="wsSendMessage();" value="Echo" type="button">
        <input οnclick="wsCloseConnection();" value="Disconnect" type="button">
    </form>
    <br>
    <textarea id="echoText" rows="5" cols="30"></textarea>
    <script type="text/javascript">
        var webSocket = new WebSocket("ws://localhost:8080/WebSocketServerExample/websocketendpoint");
        var echoText = document.getElementById("echoText");
        echoText.value = "";
        var message = document.getElementById("message");
        webSocket.onopen = function(message){ wsOpen(message);};
        webSocket.onmessage = function(message){ wsGetMessage(message);};
        webSocket.onclose = function(message){ wsClose(message);};
        webSocket.onerror = function(message){ wsError(message);};
        function wsOpen(message){
            echoText.value += "Connected ... \n";
        }
        function wsSendMessage(){
            webSocket.send(message.value);
            echoText.value += "Message sended to the server : " + message.value + "\n";
            message.value = "";
        }
        function wsCloseConnection(){
            webSocket.close();
        }
        function wsGetMessage(message){
            echoText.value += "Message received from to the server : " + message.data + "\n";
        }
        function wsClose(message){
            echoText.value += "Disconnect ... \n";
        }

        function wsError(message){
            echoText.value += "Error ... \n";
        }
    </script>
</body>
</html>

8. 运行示例

右键单击项目文件夹并选择 Run as -> Run on server 选择 Tomcat 8 server 并单击完成。

9. 结果

WebSocket 在页面加载时打开。每次在文本框中写入文本时,消息都会发送到服务器,服务器会发送回显消息响应。

10-运行示例

10-运行示例

10.下载源代码

这是一个示例:Tomcat WebSocket。

下载
你可以在这里下载 Eclipse 项目:  websocketserverexample
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Tomcat Websocket 教程 的相关文章

  • 环境变量的作用和位置

    1 当要求系统运行一个程序而没有告诉它程序所在的完整路径时 系统除了在当前目录下面寻找此程序外 还应到环境变量path中指定的路径去找 用户通过设置环境变量 来更好的运行进程 一般说的环境变量都是指系统的环境变量 2 轻松打开win10环境
  • configure交叉编译 说明

    交叉编译某个应用程序时 通常需要 configure 来生成对应的 Makefile configure 最关键的三个选项是 host HOST 指定软件运行的系统平台 如果没有指定 将会运行 config guess 来检测 build
  • YoloV8改进策略:增加分支,减少漏检

    文章目录 摘要 数据集 如何解决问题 原始网络Yolov8 改进一 改进二 改进三 总结 扩展 YoloV5增加小目标检测的分支 摘要 如何检测小目标 这个一直是比较头疼的问题 如果都是小目标还好说 我们可以采用切图的方式 如果是数据集的目
  • 目标检测——day66 Scaled-YOLOv4: Scaling Cross Stage Partial Network

    Scaled Yolov4 可伸缩跨级部分网络 Scaled YOLOv4 1 Introduction 2 Related work 2 1 Real time object detection 2 2 Model scaling 模型缩
  • Spring boot 文件下载接口

    RequestMapping xzwj 复制代码 public void xzwj HttpServletResponse res String id throws IOException String fileName 12345 png
  • ES6 Set

    ES6 Set 数据结构 定义 特殊情况 set与字符串 Set的用法 数组去重 并集 交集 差集 定义 Set对象提供了一种数据结构 类似于数组 但是没有重复值 特殊情况 Set对象存储的值具有唯一性 所以添加元素时需要判断两个元素的恒等
  • np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍

    一 np meshgrid 函数 1 np meshgrid 介绍 X Y np meshgrid x y 代表的是将x中每一个数据和y中每一个数据组合生成很多点 然后将这些点的x坐标放入到X中 y坐标放入Y中 并且相应位置是对应的 下面是
  • Redis主从复制和哨兵模式

    Redis主从复制和哨兵模式 一 Redis主从复制 1 为什么要搭建主从模式 2 主从搭建步骤 第一步 第二步 第三步 第四步 第五步 启动从机 第六步 启动6380的客户端 二 Redis哨兵模式 1 哨兵模式是什么 2 哨兵的作用 3
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 解决MySQL命令行输入密码闪退+不能启动问题

    win10环境 新下载MySQL8 0 26 刚装完还是能用 两天没打开 突然出现了问题 下面记录一下解决过程 右键屏幕底部 打开任务管理器 服务 在服务中点击查看MySQL服务状态是否为开启 MySQL服务没有开启 搜索 cmd 右键单击
  • Ansible脚本搭建k8s平台

    1 官网下载安装virtualBox centos7镜像 2 virtualBox安装centos7镜像 参考http www cnblogs com hihtml5 p 8217062 html 3 下载安装putty通过SSH连接虚拟机
  • Linux 进程基础概念-进程状态、进程构成、进程控制

    目录 Linux 进程 进程基础概念 进程状态 进程的构成 进程控制 进程创建和终止 Linux 进程 参考 linux操作系统 进程的切换与控制 到底有啥关系 知乎 zhihu com Linux进程解析 deep explore的博客
  • 【代码】处理数据集的一些常用脚本

    前言 由于训练模型经常使用到一些处理数据集的脚本 每次重新写都蛮麻烦的 因此决定整理一下之后备用 加快效率 一些是借鉴网上的脚本但是因为时间太久找不到原链接所以比较抱歉没有贴出来原链接 还有一些是自己写的 发出来分享一下 1 voc数据集抽
  • wifi卡慢延迟高_wifi卡怎么办(wifi信号满格但网速慢解决方法)

    最近学霸君有个朋友 天天吹自己家里 100M 光纤 可每晚一起开黑王者的总是说家里 WiFi 莫名卡顿 断流 然后各种理由坑人 让它换路由器吧 又不舍得花这点钱 说是够用就行 生怕自己气成祖安人的学霸君 只好上门帮他看看是不是路由器没设置好
  • [技术发展-26]:新型信息与通信网络的数据安全

    前言 网络安全 通常指计算机网络的安全 实际上也可以指计算机通信网络的安全 计算机通信网络是将若干台具有独立功能的计算机通过通信设备及传输媒体互连起来 在通信软件的支持下 实现计算机间的信息传输与交换的系统 而计算机网络是指以共享资源为目的
  • 【idea插件开发】从0入门idea插件开发,idea插件开发教程,如何开发idea插件

    idea插件介绍 作为一枚程序员 平时最常用的ide就是IntelliJ IDEA 平时会用到各种各样的插件 通过插件的使用 提高自己的开发效率 idea具有全局性 安装好插件后 对idea生效 所有的工程均能找到 idea使用的便捷性 在
  • 单词长度(输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。)

    单词长度 5分 题目内容 你的程序要读入一行文本 其中以空格分隔为若干个单词 以 结束 你要输出这行文本中每个单词的长度 这里的单词与语言无关 可以包括各种符号 比如 it s 算一个单词 长度为4 注意 行中可能出现连续的空格 输入格式
  • OpenWRT的开发

    Openwrt 官方正式的发行版是已编译好了的映像文件 后缀名bin或trx trx2 此映像文件可从Openwrt官方网站的下载页面中轻松获取到 连接地址为 OpenWrt官方网站 准备工作 在开始编译Openwrt之前需要您做些准备工作
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • goland os.Open 路径错误

    os Open 报错原因 Open不是当前目录下查找 项目取的是项目根目录 不是执行目录 证明如下 exPath os Getwd fmt Println expath exPath file err os Open exPath file

随机推荐

  • 504 错误码排查

    当出现 504 错误码时 表示请求超时 服务器无法及时响应请求 需要检查下应用是否有什么耗时的操作 比如是否出现了 SQL 慢查询 是否接口发生死循环 是否出现死锁等 同时需要关注服务器系统负载高不高 网络异常 接口原本好好的 突然出现超时
  • JAVA基础算法——将字符串按照字典倒序排序并输出

    JAVA基础算法 将字符串按照字典倒序输出 作者 飞不高的鱼 转载请注明出处 import java util Arrays import java util Comparator 将已知的乱序字符串按照字典倒序排序输出 author xi
  • 矩阵的投影、线性拟合与最小二乘法

    概要 投影矩阵 如果一个b向量进行矩阵运算 Pb 那么向量b就会投影要A的列空间的最近点 目录 一 矩阵的四大基础子空间 二 投影矩阵 三 最小二乘法 一 矩阵的四大基础子空间 一个矩阵有4个子空间 分别是行空间 零空间 列空间和左零空间
  • C#中的委托、事件与接口

    C 中的委托 事件与接口 一 委托 一 委托链 二 匿名函数 三 Lamda语句 二 事件 三 接口 一 委托 委托 将方法以变量的形式传递 以方法的形式执行 注意 赋值方法的返回类型 参数要与委托的一致 如委托定义的参数类型是string
  • 微信小程序上传文件组件

    微信小程序上传文件 一 说明 该拍照组件带有微信授权相机功能 会结合后端接口 将上传的图片以数组集合的形式传值给父级页面 注意 组件适用于 单独上传图片 不携带参数 结合后端接口返回路径之后 再调用另外的保存接口 携带参数与图片提交的场景
  • 抓取第三方网站数据

    最近需要把某网站的统计数据聚合到我们自己的系统里 但是该网站没有提供标准API 所以就尝试自己抓取了一下 本文总结一下一般的方法 分析服务地址 通常网站有2种做法 一种是后端渲染 直接把渲染后的完整界面呈现在浏览器 另一种前端是静态页面 通
  • mybatis plus中的${ew.sqlSegment},${ew.sqlSelect},${ew.customSqlSegment},${ew.sqlSet}使用

    ew是mapper方法里的 Param Constants WRAPPER Wrapper queryWrapper对象 首先判断ew emptyOfWhere是否存在where条件 有的话再拼接上去 ew customSqlSegment
  • java毕业设计——基于JSP+JavaBean+sqlserver的在线购物系统设计与实现(毕业论文+程序源码)——在线购物系统

    基于JSP JavaBean sqlserver的在线购物系统设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于JSP JavaBean sqlserver的在线购物系统设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要
  • 品味树莓派:GPIO Zero库使用入门

    文章目录 目的 基础说明 入门使用 LED PWMLED Button 更多入门例程 类基础说明 注意事项 总结 目的 树莓派有很多GPIO口可供用户使用 官方同时也提供了一些方式来操作这些IO口 其中目前主要推荐的是基于Python的GP
  • 1、什么是Shader

    什么是Shader Shader 中文名为着色器 Shader其实就是专门用来渲染图形的一种技术 通过shader 我们可以自定义显卡渲染画面的算法 使画面达到我们想要的效果 小到每一个像素点 大到整个屏幕 Shader分为两类 顶点Sha
  • 使用Gradle构建SpringBoot工程系列:第八篇:使用spring-data-jpa 实现数据持久化

    本篇文章是SpringBoot 系列文章的第八篇文章 由于本人工作原因 中断了一段时间 接下来的一段时间里 将陆续更新本系列的其他文章 回归Spring Boot技术体系 记录本人学习和使用Gradle构建spring Boot工程的过程
  • C/C++蓝桥杯三升序列

    本题答案可能是错的 我算出的是180414 和很多博主的答案不一样 我也不太懂哪里有问题 大家可以探讨一下 题目描述 对于一个字母矩阵 我们称矩阵中的一个三升序列是指在矩阵中找到三个字母 它们在同一行 同一列 或者在同一45 度的斜线上 这
  • OpenFlow流表_时间因素

    目标 现有拓扑结构如下的网络结构 s1 s4为交换机 h1 h9为主机 现欲让h1和h2白天ping不通 晚上ping的通 拓扑结构 s1
  • es6查找指定字符下标,并把第一个字符前面的内容删掉

    前言 用es6实现查找指定字符下标 并把第一个字符前面的内容删掉 原字符串 abc 123 bcd 444 目标字符 123 bcd 444 实现方法 let abc abc 123 bcd 444 let mmm abc indexOf
  • springcloud与springboot版本列表查看及依赖关系查看

    一 版本规则说明 1 springboot版本 Spring Boot 2 2 5 RELEASE表示主版本 次版本 增量版本 Bug修复 主要 版本中的第一个数字 2 和 3 是 Python 的著名 主要版本 主要部分是基于日历的最常见
  • (华硕)电脑第一次开机蓝屏,二次开机启动

    华硕主板 第一次开机蓝屏 二次开机启动 使用了无缓存的M 2 SSD 2个通道的SSD 修改开机模式 改成兼容模式启动
  • 【H5】阻止H5页面播放视频默认全屏

    老是看到有人找不到阻止视频默认全屏的问题 看到别人发的帖子不是隐藏video标签使用canvas绘制视频就是使用插件来禁止视频默认全屏的问题 其实没有那么麻烦的只需要设置一下属性就可以了 x5 playsinline true 安卓需要设置
  • gRPC-Java实现各种服务类型

    gRPC实现 借助gRPC 我们可以在一个 proto文件中定义一次服务 并以gRPC支持的任何语言生成客户端和服务器 而这又可以在从大型数据中心内的服务器到电脑的各种环境中运行 gRPC为您处理不同的语言和环境 还获得了使用协议缓冲区的所
  • 设计模式-Visitor模式(访问者模式)

    什么是访问者模式 另一个例子 双重分发 开闭原则 对扩展开放 对修改关闭 优缺点 什么是访问者模式 将数据结构与处理分离开来 比如一个人 他有自己的名字 他可以吃东西 这里的 人 就是一个数据结构 名字是属性 吃东西是行为方法 处理 pub
  • Apache Tomcat Websocket 教程

    WebSocket 是一种计算机通信协议 旨在在 Web 浏览器和 Web 服务器中实现 但它可以被任何客户端或服务器应用程序使用 WebSocket 协议是一个独立的基于 TCP 的协议 它与 HTTP 的唯一关系是它的握手被 HTTP