WebSocket服务端和客户端代码示例

news2024/11/16 10:49:16

目录

    • 一、WebSocket简介
    • 二、WebSocket服务端代码示例
    • 三、WebSocket客户端代码示例
    • 四、运行服务端和客户端,查看输出结果

一、WebSocket简介

  • WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,即允许服务器主动发送信息给客户端。因此,在WebSocket中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输,客户端和服务器之间的数据交换变得更加简单。

二、WebSocket服务端代码示例

  • 服务端示例代码

    package com.worklite.out.socket;
    
    import lombok.extern.slf4j.Slf4j;
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @description:
     * @author: xz
     */
    @Slf4j
    public class SocketServer extends Thread{
        Socket socket = null;
    
        public SocketServer(Socket socket) {
            this.socket = socket;
        }
    
        @Override
        public void run() {
            BufferedReader bufferedReader = null;
            PrintWriter writer = null;
            try {
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //true,表示自动刷新,不需要人为触发
                writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
    
                String userInput;
                while ((userInput = bufferedReader.readLine()) != null) {
                    if ("exit".equals(userInput)) {
                        log.info("短信socket服务端退出连接通信\t");
                        break;
                    }
                    log.info("短信socket服务端 接收内容:\t" + userInput);
                    String result = "<?xml version=\"1.0\" encoding=\"utf-8\"?><response>0000</response>";
                    writer.println(result);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (writer != null){
                        writer.close();
                    }
                    if (bufferedReader != null) {
                        bufferedReader.close();
                    }
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            try {
                //1.创建服务器端ServerSocket对象,指定端口
                ServerSocket serverSocket = new ServerSocket(64202);
                Socket socket = null;
                log.info("短信socket服务端等待客户端的连接");
                //2.调用accept()监听(即等待客户端的连接)
                while (true) {
                    socket = serverSocket.accept();
                    //创建一个新线程
                    SocketServer serverThread = new SocketServer(socket);
                    serverThread.start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    

三、WebSocket客户端代码示例

  • 客户端示例代码

    package com.worklite.out.socket;
    
    import lombok.extern.slf4j.Slf4j;
    import java.io.*;
    import java.net.Socket;
    /**
     * @description:
     * @author: xz
     */
    @Slf4j
    public class SocketClient {
    
        public static String client(String reqXmlStr,String socketIp,int socketPort) {
            log.info("调用短信socket客户端,xml格式请求报文——>{}",reqXmlStr);
            Socket socket = null;
            BufferedReader bufferedReader = null;
            PrintWriter writer = null;
            String result = null;
            try {
                socket = new Socket(socketIp,socketPort);
    
                //发送数据到服务端
                writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
                writer.println(reqXmlStr);
    
                //接收服务端返回数据流
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                while ((result = bufferedReader.readLine()) != null){
                    log.info("短信socket客户端接收服务端响应报文:{}",result);
                    //退出指令,关闭连接
                    writer.println("exit");
                    break;
                }
            }catch (IOException e) {
                log.info("[短信socket客户端异常]",e);
                e.printStackTrace();
            } finally {
                try {
                    if (writer != null){
                        writer.close();
                    }
                    if (bufferedReader != null) {
                        bufferedReader.close();
                    }
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException e) {
                    log.info("[短信socket客户端流关闭异常]",e);
                    e.printStackTrace();
                }
            }
            return result;
        }
    
        public static void main(String[] args) {
            String reqXmlStr="<?xml version=\"1.0\" encoding=\"utf-8\"?><request><telnumber>13912345678</telnumber></request>";
            client(reqXmlStr,"localhost",64202);
        }
    
    }
    

四、运行服务端和客户端,查看输出结果

  • 先启动服务端,如下图所示:
    在这里插入图片描述
  • 再启动客户端,如下图所示:
    在这里插入图片描述
  • 再次查看服务端,如下图所示:
    在这里插入图片描述

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

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

相关文章

UE4 优化笔记

一、衡量场景性能的指标(这些指标优化前就要先记录下来&#xff0c;这样才知道优化了多少&#xff01;) 1.stat unit&#xff1a;单元的状态。最开始根据这个数据&#xff0c;确定大致的优化方向 Frame&#xff1a;每帧消耗的总时长 Game&#xff1a;游戏线程运行消耗的时间 D…

迭代最近点ICP点云配准

传统ICP存在匹配速度慢&#xff0c;误匹配率高等缺点。 粗配准是在不清楚两个点云的相对位置的情况下&#xff0c;找到这两个点云近似的旋转平移矩阵&#xff0c;主要是为精配准提供初始变换矩阵&#xff1b;精配准在已知旋转平移矩阵的情况下&#xff0c;通过多次迭代优化进一…

Redis超详细版教程通俗易懂

【狂神说Java】Redis最新超详细教程通俗易懂 一、缓存、关系型数据库、非关系型数据库 关系型数据库存放在磁盘上&#xff0c;读取数据需要IO操作&#xff0c;速度非常慢非关系型数据库存放在内存上&#xff0c;读取数据速度非常快两者关系&#xff1a;一般会将数据存储在关系…

BGP在数据中心的应用4——BGP配置再优化

注&#xff1a; 本文根据《BGP in the Datacenter》整理&#xff0c;有兴趣和英文阅读能力的朋友可以直接看原文&#xff1a;https://www.oreilly.com/library/view/bgp-in-the/9781491983416/上一部分笔记请参考&#xff1a;https://blog.csdn.net/tushanpeipei/article/deta…

图论(3)单源最短路拓展

活动 - AcWing acw1137 如果我们确定了起点&#xff0c;那么就是一个模板题 选起点有两个办法&#xff1a;1.选取虚拟原点&#xff0c;连接家附近的所有车站。直接以虚拟原点作为我起点跑最短路即可。2.反向建图&#xff0c;取终点到家附近所有车站的dist&#xff0c;取min即…

JVM垃圾回收器-Serial回收器:串行回收

文章目录学习资料垃圾回收器Serial回收器&#xff1a;串行回收学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java JDK 8 JVM官方手册 垃圾回收器 Serial回收器&#xff1a;串行回…

JVM垃圾回收相关算法-垃圾清除阶段

文章目录学习资料垃圾回收相关算法垃圾清除阶段标记-清除&#xff08;Mark - Sweep&#xff09;算法复制算法标记-压缩&#xff08;或标记-整理、Mark - Compact&#xff09;算法分代收集算法增量收集算法分区算法学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟…

助力工业物联网,工业大数据项目介绍及环境构建【三】

01&#xff1a;业务系统结构 目标&#xff1a;了解一站制造中的业务系统结构 实施 数据来源 业务流程 油站站点联系呼叫中心&#xff0c;申请工单呼叫中心分派工单给工程师工程师完成工单工程师费用报销呼叫中心回访工单 ERP系统&#xff1a;企业资源管理系统&#xff0c;存…

RHCSE第一天(Linux的例行性工作)

文章目录Linux搭建服务器的准备工作第一章 Linux的例行性工作1.1 单一执行的例行性工作at1.1.1 at命令的实际工作过程1.1.2 at命令详解1.2 循环执行的例行性工作1.2.1 crontab命令的实际工作过程1.2.2 crontab命令详解1.3 实验实验一&#xff1a;定义三分钟之后显示hello实验二…

【前端】Vue项目:旅游App-(4)TabBar:Vant库实现功能与样式

文章目录目标代码和过程Vant库引入自定义样式初步修改样式修改修改active颜色icon调大实现路由跳转效果总代码修改的文件tab-bar.vuemain.js目标 前文手写了TabBar的样式和功能&#xff0c;本篇我们用vant库重新实现这些功能。 代码和过程 Vant库引入 Vant4 官方文档 安装&…

Servlet运行原理及生命周期

Servlet运行原理及生命周期一、Servlet 运行原理1.1 Tomcat 的定位1.2 Tomcat 的伪代码1.2.1 Tomcat 初始化流程1.2.2 Tomcat 处理请求流程1.2.3 Servlet 的 service 方法的实现二、Servlet生命周期一、Servlet 运行原理 承接 Servlet基础教程&#xff1a;https://blog.csdn.n…

spring oAuth2.0

会话 用户认证通过后&#xff0c;为了避免用户的每次操作都进行认证可将用户的信息保证在会话中。会话就是系统为了保持当前用户的登录状态所提供的机制&#xff0c;常见的有基于session方式&#xff0c;基于token方式等。 基于session的认证方式&#xff1a; 用户认证成功后&a…

Qt扫盲-QSS帮助手册使用

QSS帮助手册使用一、概述1. 查找 Qt Style Sheets Reference2. 收藏一下二、Qt Assistant 查阅帮助1. List of Stylable Widgets2. List of Properties3. List of Icons4. List of Property Types5. List of Pseudo-States6. List of Sub-Controls一、概述 导言&#xff1a;这…

基于信创运维平台,实现国产化网络自动巡检

近年来&#xff0c;以工业互联网、大数据、人工智能、5G技术等为代表的新一代信息技术飞速发展&#xff0c;推动国内企业向数字化经济的变革&#xff0c;数字化变成一股不可逆转的潮流&#xff0c;也是增强企业竞争力的关键所在。北京智和信通积极探索&#xff0c;把握新一轮数…

Pytorch模型转成onnx并可视化

文章目录转换模型前提转换方法模型可视化可能出现的报错信息ValueError: torch.nn.DataParallel is not supported by ONNX exporter, please use attribute module to unwrap model from torch.nn.DataParallel. Try torch.onnx.export(model.module, ...)RuntimeError: ONNX …

流媒体基础-RTP封装PS流

PS流格式 首条数据结构: RTP Header + PS Header +(System Header + PSM)+ PES(Header + Payload) 非首条数据结构: RTP Header + PS Header + PES(Header + Payload) 接下来记录侧重于找到 H.264 数据,所以会跳过一些暂时不关心的内容。 PS流有一个结束码 MPEG_progr…

信息学奥赛一本通 1916:【01NOIP普及组】求先序排列 | 洛谷 P1030 [NOIP2001 普及组] 求先序排列

【题目链接】 ybt 1916&#xff1a;【01NOIP普及组】求先序排列 洛谷 P1030 [NOIP2001 普及组] 求先序排列 【题目考点】 1. 二叉树 【解题思路】 已知中序、后序遍历序列&#xff0c;构建二叉树&#xff0c;而后对该二叉树做先序遍历&#xff0c;得到先序遍历序列。 该题…

质性分析软件nvivo的学习(二)

0、前言&#xff1a; 这部分内容是&#xff0c;质性分析软件nvivo的学习&#xff08;一&#xff09;的衔接内容&#xff0c;建议看完&#xff1a;质性分析软件nvivo的学习&#xff08;一&#xff09;再看这部分内容。这里的笔记都是以nvivo12作为学习案例的&#xff0c;其实不…

JVM垃圾回收的并行与并发

文章目录学习资料垃圾回收的并行与并发并发&#xff08;Concurrent&#xff09;并行&#xff08;Parallel&#xff09;并发 vs 并行总结学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Java开发手册】https://www.w3cschool.cn/aliba…

RHCEansible 任务模块

文件操作模块 file模块 ansible-doc file -s path参数 &#xff1a;必须参数&#xff0c;用于指定要操作的文件或目录&#xff0c;在之前版本的ansible中&#xff0c;使用dest参数或者name参数指定要操作的文件或目录&#xff0c;为了兼容之前的版本&#xff0c;使用dest或n…