websocket在java中的使用教程

news2024/11/14 20:31:04

本文从websocket服务端和客户端两个方面简单介绍下websocket在java中的使用。

一、websocket服务端(WebSocketServer)

websocket服务端是以本机作为消息的接受端,用于接受客户端websocket发送过来的消息,并可以通过客户端的websocket对象来反馈消息给websocket客户端,以下为websocket服务端创建步骤。

创建myWebSocketServer.java类,并继承WebSocketServer,并实现内部的5个方法,初始代码如下

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

public class myWebSocketServer extends WebSocketServer {

    @Override
    public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
        
    }

    @Override
    public void onClose(WebSocket webSocket, int i, String s, boolean b) {

    }

    @Override
    public void onMessage(WebSocket webSocket, String s) {

    }

    @Override
    public void onError(WebSocket webSocket, Exception e) {

    }

    @Override
    public void onStart() {

    }
}

onOpen方法会在客户端websocket连接上当前服务端时调用,参数webSocket代表的就是客户端的websocket对象,可以通过该对象发送消息给客户端,也可以通过该对象获取客户端的ip地址等信息。

onClose方法是当客户端断开连接时调用

onMessage方法则是客户端向服务端发送消息时调用,其中webSocket参数表明发送消息的客户端,字符串s表示所发送的消息

onError方法是当客户端和当前服务端通信出现异常时调用

onStart方法则是服务端开启时调用

为此,我们可以实现简单的一些功能

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;

public class myWebSocketServer extends WebSocketServer {

    // 定义有参构造器,用于服务端websocket的创建
    public myWebSocketServer(String ip,Integer port){
        super(new InetSocketAddress(ip,port));
    }

    // 定义一个集合用来存储和当前websocket服务器保持连接的websocket客户端
    List<WebSocket> onLine = new ArrayList<>();
    @Override
    public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
        System.out.println("有新的websocket客户端连接:"+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort());
        // 当有客户端连接将其加入onLine集合中
        onLine.add(webSocket);
    }

    @Override
    public void onClose(WebSocket webSocket, int i, String s, boolean b) {

        System.out.println("websocket客户端断开连接:"+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort());
        // 当有客户端断开连接将其从onLine集合中移除
        onLine.remove(webSocket);
    }

    @Override
    public void onMessage(WebSocket webSocket, String s) {
        System.out.println("收到客户端 "+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 发送过来的消息:"+s);
        // 向客户端回馈消息
        webSocket.send("收到");
        // 亦可以群发消息
        for (WebSocket socket : onLine) {
            socket.send(webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 群发消息:"+s);
        }
    }

    @Override
    public void onError(WebSocket webSocket, Exception e) {
        System.out.println("和客户端 "+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 通信发生异常");

    }

    @Override
    public void onStart() {
        System.out.println("websocket服务端已启动");
    }
}

websocket客户端(WebSocketClient)

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;

public class myWebSocketClient extends WebSocketClient {
    public myWebSocketClient(URI serverUri) {
        super(serverUri);
    }

    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        System.out.println("websocket成功连接");
    }

    @Override
    public void onMessage(String s) {
        System.out.println("收到服务端发送的消息:"+s);

    }

    @Override
    public void onClose(int i, String s, boolean b) {
        System.out.println("已经和服务端断开连接");
    }

    @Override
    public void onError(Exception e) {
        System.out.println("和服务端通信发送异常");
    }
}

websocket客户端实现的方法含义和服务端一样

服务端和客户端通信测试

创建测试类

public class webSocketTest {


    public static void main(String[] args) throws Exception {
        // 创建服务端websocket对象
        myWebSocketServer server = new myWebSocketServer("127.0.0.1",8899);
        // 启动服务端websocket
        server.start();

        // 循环启动多个客户端连接服务端
        for (int i = 0;i<4;i++) {
            // 连接服务端websocket的地址
            URI uri = new URI("ws://127.0.0.1:8899");
            // 创建客户端websocket对象
            myWebSocketClient client = new myWebSocketClient(uri);
            // 阻塞式连接
            client.connectBlocking();
            // 向服务端发送消息
            client.send("我是客户端"+i);
        }
    }
}

执行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

06_netdev网卡设备内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读315次&#xff0c;点赞3次&#xff0c;收藏3次。环境IDubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384my_netdev.c #include <linux/kernel.h> #incl…

Unity 使用AddListener监听事件与取消监听

在Unity中&#xff0c;有时候我们会动态监听组件中的某个事件。当我们使用代码动态加载多次&#xff0c;每次动态加载后我们会发现原来的和新的事件都会监听&#xff0c;如若我们只想取代原来的监听事件&#xff0c;那么就需要取消监听再添加监听了。 如实现如下需求&#xff…

yml代替properties文件进行springboot项目配置

任务&#xff1a;使用yml格式文件代替properties格式文件进行便捷有效的springboot项目配置。 原先&#xff1a; 在与application.properties文件同级目录下新建application.yml文件&#xff0c;以上配置内容修改为&#xff1a; 注&#xff1a;yml文件的一些编写规范

前端爬虫+可视化Demo

爬虫简介 可以把互联网比做成一张 “大网”&#xff0c;爬虫就是在这张大网上不断爬取信息的程序。 爬虫是请求网站并提取数据的自动化程序。 省流&#xff1a;Demo实现前置知识&#xff1a; JS 基础Node 基础 &#xff08;1&#xff09;爬虫基本工作流程&#xff1a; 向…

跨境电商必看:跨境出海实用工具!

对于想要出海扩展业务的电商从业者来说&#xff0c;用好工具和资源至关重要。本文将分享一些跨境出海的使用工具&#xff0c;助力跨境业务。 关键词工具 Google Trends&#xff08;谷歌趋势&#xff09;&#xff1a; 它的数据来源于谷歌搜索&#xff0c;依靠Google全世界数十…

R语言简介、环境与基础语法及注释

R语言简介、环境与基础语法及注释 一、R语言1.R语言简介2.R语言官网3.R语言中国的镜像网站4.R语言下载5.R语言的历史 二、R语言环境1.Windows安装1.1 去 R 语言下载的镜像站点的列表下载1.2 选择版本进行下载1.3 点击运行1.4 一路默认&#xff0c;安装完毕&#xff01; 2.Linux…

maven配置文件(一)Settings配置

一、仓库 1、关系 我们依赖的外部服务是需要有地方进行存储的&#xff0c;而存储的地方就称之为仓库。其中仓库又分为本地仓库、中央仓库、镜像仓库、私服。 &#xff08;1&#xff09;本地仓库 当项目在本地编译或运行时&#xff0c;直接加载本地的依赖服务无疑是最快的。默…

[计算机网络]:流量控制

一、流量控制简介 一条TCP连接的每一侧主机都为其设置了接收缓存&#xff0c;当TCP成功连接后&#xff0c;它发送的数据会放入接受缓存中。相关联的进程会从缓存中读取数据。但是存在一个问题&#xff0c;当某应用程序读取数据速率太慢&#xff0c;而发送数据一方不停的发送数…

Flutter学习8 - 网络编程 Http

1、配置 Http 依赖 Flutter 工具库搜索地址&#xff1a;https://pub.dev/ http最新版本查看网址&#xff1a; https://pub.dev/packages/http 在 pubspec.yaml 中引入 http 插件 dependencies:flutter:sdk: flutterhttp: ^0.13.4 # 请检查并使用最新版本命令行中输入 “ flut…

【C语言基础】:深入理解指针(二)

文章目录 深入理解指针一、指针运算1. 指针 - 整数2. 指针 - 指针3. 指针的关系运算 二、野指针1. 野指针成因2. 如何避免野指针 三、assert断言四、指针的使用和传址调用4.1 strlen的模拟实现4.2 传值调用和传址调用 五、指针与数组5.1 数组名的理解5.2 指针访问数组5.3 一维数…

蓝桥杯-单片机组基础7-存储器映射扩展与PWM脉冲调制(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

HCIA-HarmonyOS设备开发认证V2.0-习题

目录 习题一习题二习题三&#xff08;待续...&#xff09;坚持就有收获 习题一 # HarmonyOS简介 1. 以下哪几项属于OpenHarmony的技术特性&#xff1f;&#xff08;&#xff09;A. 统一OS&#xff0c;弹性部署B. 一次开发&#xff0c;多端部署C. 硬件互助&#xff0c;资源共享…

基于数字孪生的机场人群智慧管控技术

源自&#xff1a;系统仿真学报 作者&#xff1a;钟竞辉,林育钿,李稳强&#xff0c;蔡文桐 “人工智能技术与咨询” 发布 摘 要 针对机场人群应急管控和管理智能化的需求&#xff0c;提出基于数字孪生的机场人群智慧管控方案。构建了包含数据层、建模层、功能层和应用层四维…

【JavaEE进阶】 Linux搭建Java部署环境

文章目录 &#x1f343;前言&#x1f334;Linux权限&#x1f6a9;用户操作&#x1f6a9;三种角色&#x1f6a9;文件类型和访问权限&#x1f388;文件类型&#x1f388;基本权限 &#x1f6a9;修改文件权限 &#x1f38d;搭建Java部署环境&#x1f6a9;apt&#x1f388;apt常用命…

【c++】STL--List的实现

目录 一. List的数据结构 二. List实现的基本框架 1. list的结点结构类 2. List的迭代器类 正向迭代器 反向迭代器 3. List操作接口的实现 1. 默认成员函数 构造函数 和 析构函数 拷贝构造函数 和 赋值运算符重载 2. 修改相关函数接口 insert 和 erase …

人大金仓KingbaseES:windows安装

人大金仓KingbaseES&#xff1a;windows安装 产品简介 金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司&#xff08;简称人大金仓&#xff09;自主研发的、具有自主知识产权的商用关系型数据库管理系统&#xff08;DBMS&#xff09;。该产品面向事务…

春日特惠,爱基百客限时放送,开启您的学术新篇章!

春回大地&#xff0c;万物复苏&#xff0c; 正是探索未知、启发新思的最佳时节。 在这个充满生机的季节里&#xff0c; 我们推出了春季大促活动&#xff0c; 旨在助力每一位科研工作者在新的一年里实现更多突破。 让我们一起迎接科研人的春天&#xff0c; 开启智慧的花朵…

初阶数据结构:二叉树(补充扩展)

目录 1. 堆排序1.1补充&#xff1a;建堆的时间复杂度1.2 堆排序&#xff1a;升序与降序 2. TopK问题3. 二叉树的链式结构及其遍历方式3.1 二叉树的链式结构3.2 二叉树的前序遍历2.2 二叉树的中序遍历2.3 后序遍历2.4 层序遍历 4. 二叉树OJ练习4.1 单值二叉树4.2 判断两棵二叉树…

“零碳未来”:引领全球向低碳经济转型

全球环境基金(GEF),这个由183个国家和地区组成的国际合作组织,是世界银行1990年创建的实验项目,一直致力于支持环境友好型项目,推动全球环境改善。而“零碳未来”不仅是一个由全球环境基金(GEF)创建的跨越国界的全新交易平台,更是一个致力于推动全球向低碳经济转型的零碳排放生…

代码随想录day12(2)字符串:重复的子字符串(leetcode459)

题目要求&#xff1a;给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 思路&#xff1a; 一、首先对于暴力解法&#xff0c;可以枚举所有的字串进行判断。但是枚举时实际上只需…