java web tcp 长连接_netty通过websocket实现服务器与客户端的长连接

2023-11-16

server端代码import com.chinadaas.bio.chinadaasbio.webSocket.handler.ServerHandler;

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.ChannelPipeline;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

import io.netty.handler.codec.http.HttpObjectAggregator;

import io.netty.handler.codec.http.HttpServerCodec;

import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;

import io.netty.handler.logging.LogLevel;

import io.netty.handler.logging.LoggingHandler;

import io.netty.handler.stream.ChunkedWriteHandler;

public class Server {

public static void main(String[] args) throws Exception {

NioEventLoopGroup boosGroup = new NioEventLoopGroup(1);

NioEventLoopGroup workerGroup = new NioEventLoopGroup();

try {

ServerBootstrap serverBootstrap = new ServerBootstrap();

serverBootstrap.group(boosGroup, workerGroup);

serverBootstrap.channel(NioServerSocketChannel.class);

serverBootstrap.option(ChannelOption.SO_BACKLOG, 128);

serverBootstrap.option(ChannelOption.SO_KEEPALIVE, true);

serverBootstrap.handler(new LoggingHandler(LogLevel.INFO));

serverBootstrap.childHandler(new ChannelInitializer() {

@Override

protected void initChannel(SocketChannel socketChannel) throws Exception {

ChannelPipeline pipeline = socketChannel.pipeline();

// 因为是基于http的 所以使用http的编码和解析器

pipeline.addLast(new HttpServerCodec());

// 是以块方式写,添加ChunkWriteHandler() 处理器

pipeline.addLast(new ChunkedWriteHandler());

// http在传输过程中是分段的,这就是为什么当浏览器发送大量数据的时候,会发出多次http请求

pipeline.addLast(new HttpObjectAggregator(8192));

// 1:对应websocket 他的数据是以帧的形式传递

// 2: WebSocketServerProtocolHandler 功能是将http协议升级为ws协议,保持一个长连接

pipeline.addLast(new WebSocketServerProtocolHandler("/hello"));

// 添加自定义的handler

pipeline.addLast(new ServerHandler());

}

});

ChannelFuture channelFuture = serverBootstrap.bind(8886).sync();

channelFuture.channel().closeFuture().sync();

} finally {

boosGroup.shutdownGracefully();

workerGroup.shutdownGracefully();

}

}

}

ServerHandler 代码import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.SimpleChannelInboundHandler;

import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.time.LocalDateTime;

public class ServerHandler extends SimpleChannelInboundHandler {

@Override

protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {

System.out.println("服务器收到消息:" + textWebSocketFrame.text());

channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("服务器时间" + LocalDateTime.now() + " " + textWebSocketFrame.text()));

}

@Override

public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {

System.out.println(ctx.channel().remoteAddress()+"断开了连接");

}

}

websocket html 代码

Title

var socket;

if (window.WebSocket) {

socket = new WebSocket("ws://localhost:8886/hello")

socket.onmessage = function (ev) {

var rt = document.getElementById("responseText")

rt.value = rt.value + "\n" + ev.data;

}

socket.onopen = function (ev) {

var rt = document.getElementById("responseText")

rt.value = "连接开启了...";

}

socket.onclose = function (ev) {

var rt = document.getElementById("responseText")

rt.value = rt.value + "\n" + "连接关闭了";

}

} else {

alert("当前浏览器不支持websocket")

}

function send(message) {

if (!window.socket) {

return;

}

if (socket.readyState == WebSocket.OPEN) {

socket.send(message);

} else {

alert("连接没有开启...")

}

}

欢迎大家前来讨论

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

java web tcp 长连接_netty通过websocket实现服务器与客户端的长连接 的相关文章

  • .NET C#基础(5):结构体 - 高性能代码的基石

    0 文章目的 本文面向有一定 NET C 基础知识的学习者 介绍C 中结构体定义 使用以及特点 1 阅读基础 了解C 基本语法 了解 NET中的栈与托管堆 2 值类型 2 1 NET的两大类型 在 NET中 所有类型都是object类型的子
  • Excel行高、列宽怎么调整?

    在日常工作中 经常会需要用到Excel表格 如果打开的Excel表格行高列宽不是我们想要的 要怎么调节到合适的大小呢 方法一 打开Excel表格 按 Ctrl A 快捷键 选中全部表格 或者点击表格左上角 行号和列标交汇处的灰色小三角 也可
  • CEPH PG incomplete状态修复

    某运营商的Kubernetes项目物理机停机维护 重启后Kubernetes部分pod无法挂载PVC 请求超时 该Kubernetes集群的后端存储使用ceph rbd块存储 检查ceph集群状态异常 root ceph node01 ce
  • Nacos

    一 Nacos Spring Cloud Alibaba https spring io projects spring cloud alibaba Nacos 官网 https nacos io zh cn docs what is na
  • openGL library下载地址

    GLUT下载页面 http www opengl org resources libraries glut glut downloads php GLUT for Win32下载页面 http www xmission com nate g
  • linux系统虚拟机安装centos7

    一 安装 第一步 下载安装VMware Fusion Mac版本下载后双击安装 这里不做过程记录 第二步 下载CentOS 7安装包 CentOS 7 x86 64 DVD 1810 iso 本文不提供下载地址 第三步 在VMware Fu
  • Vue中使用render 封装el-table解决多级表头自定义模板

    vue中多数情况下使用template封装组件逻辑清晰结构简单 但是在某些情况下 比如非常简单的组件 vue render简单解析或者template无法解决某些场景下 使用完全javascirpt能力就显得尤为重要 文章目录 使用rend
  • VB.Net常用的正则表达式(实例)

    d 非负整数 正整数 0 0 9 1 9 0 9 正整数 d 0 非正整数 负整数 0 0 9 1 9 0 9 负整数 d 整数 d d 非负浮点数 正浮点数 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1
  • 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数---百度笔试题

    题目 给定一个存放整数的数组 重新排列数组使得数组左边为奇数 右边为偶数 要求 空间复杂度O 1 时间复杂度为O n 我自己写了一下 之前写的那个不对 现在重写了 时间复杂度达到O n void swap int a int i int j
  • python数据可视化-折线图

    可通过ab173 com查看json数据 导入json import json 处理数据 美国为例 f us open D 桌面 折线图数据 美国 txt r encoding UTF 8 us data f us read 美国的全部内容
  • VMware17虚拟机安装及Linux系统搭建(详细版)

    作者简介 大家好 我是小杨 个人主页 小杨 的csdn博客 希望大家多多支持 一起进步呀 前言 VMware是一个虚拟PC的软件 可以在现有的操作系统上虚拟出一个新的硬件环境 相当于模拟出一台新的PC 进行计算机的管理 软件安装 文件的使用
  • 这十个步骤让你的 App 避规ios 4.3被拒问题

    4 3 垃圾应用 请不要为同一个 App 创建多个套装 ID 如果您的 App 针对特定位置 运动队 大学等存在不同版本 请考虑提交单个 App 并提供 App 内购买以提供差异功能 同时 请避免继续在已有大量类似 App 的类别下进行开发
  • kubectl应用

    文章目录 kubectl用法概述 kubectl输出格式 kubectl操作示例 kubectl用法概述 kubectl命令语法 kubectl command TYPE NAME flags 其中 command TYPE NAME fl
  • 如何计算内存大小

    对电子产品 存储介质厂家来说 是按进率1000来计量的 即1000B 1KB 1000KB 1MB 1000MB 1GB 也就是为什么硬盘分区后 会造成缩水 比如80G硬盘实际等于76G 的原因 因为系统是按1024进率来进行分区的 注 我
  • 多文件编程

    文章目录 什么是多文件编程 lt gt 与 多文件编程方法 变量重复定义与头文件重复包含 变量重复定义 头文件重复包含 为什么要避免重复包含 如何解决 1 ifndef 2 pragma once 小总结 什么是多文件编程 多文件编程 指的
  • vite postcss

    PostCSS PostCSS是一款使用JavaScript插件对CSS实现转换的工具 PostCSS拥有非常强大的插件 典型的比如autoprefixer cssnext css modules等 PostCSS插件的处理方式类似CSS预
  • CSS:基本选择器中的ID选择器和class选择器的区别

    ID选择器 通过标签的id名称来选择标签 id 类选择器 class选择器 选择一个类别 className 区别 1 ID 选择器的是以井号 开头来定义的 类 选择器是以点 来定义的 2 ID 选择器在 HTML 中是可以通过 id 属性
  • 2_Nginx 语法

    文章目录 一些说明 配置静态资源服务器 常用指令 一些说明 指令 指令块 指令以分号结尾 一条指令可以有一个或多个参数 参数之间以空格分隔 例如 server name 指令块可以有名字或者没有名字 include 允许组合多个配置文件 以
  • 面经(一)广州保伦电子有限公司校招宣讲面经

    前言 本章主要讲述我曾参加广州保伦有限公司的学校宣讲并笔试的经历 一 经历概述 宣讲前 在得知该公司会来我们学校进行宣讲时 我看到有招聘Java开发职位 就马上决定参加该公司的宣讲 因为我们学校是最后一次宣讲的地方 自己心里也知道人肯定是招

随机推荐

  • Design Compiler (七)——环境、设计规则和面积约束

    本文如果有错 欢迎留言更正 此外 转载请标明出处 http www cnblogs com IClearner 作者 IC learner 本文的主要内容是讲解 约束针对的是逻辑综合下的约束 而实战部分则是在DC的拓扑模式下进行 环境属性的
  • image not loaded  try to open it externally to fix format problem

    image not loaded try to open it externally to fix format problem 图片没有加载 请从外部打开图片以解决格式问题 由于项目是直接复制过来的 图片从外部打开显示为空 直接全部替换重
  • 编码规范(三)----静态分析工具PMD

    一 简介 1 1 什么是静态代码分析 静态代码分析是指无需运行被测代码 仅通过分析或检查源程序的语法 结构 过程 接口等来检查程序的正确性 找出代码隐藏的错误和缺陷 如参数不匹配 有歧义的嵌套语句 错误的递归 非法计算 可能出现的空指针引用
  • 形象的理解TCP协议为什么要“三次握手”

    我们先来看看专业的解读是怎么简单描述 三次握手 的 以下图片来自百度百科 如果你看完一脸懵圈 不妨想想三次握手的目的 那就是确保客户端和服务器能够正常通讯 当然 本文只是从非专业的角度解释为何TCP建立连接的三次握手就能保证正常通讯 为何不
  • Java创建对象数组出现空指针报错

    public static void main String args teacher d new teacher 2 System out println d 0 其中创建的数组d的内存状态为空 输出数组d其中一个元素是null 即使随便
  • 你了解模糊测试(fuzz testing)吗?

    模糊测试 fuzz testing 是一类安全性测试的方法 说起安全性测试 大部分人头脑中浮现出的可能是一个标准的 黑客 场景 某个不修边幅 脸色苍白的年轻人 坐在黑暗的房间中 正在熟练地使用各种工具尝试进入某个系统 这种由安全人员 模拟黑
  • 图像&视频编辑工具箱MMEditing使用示例:图像超分辨率(super-resolution)

    MMEditing的介绍及安装参考 https blog csdn net fengbingchun article details 126331541 这里给出图像超分的测试代码 论文 Learning Continuous Image
  • go 流媒体服务搭建-01

    这里写自定义目录标题 go 流媒体服务搭建 01 go 流媒体服务搭建 01 新建go 项目 配置go 版本1 19 新增main go package main func main 新增go mod 文件 go mod init mym7
  • C语言之路---三大结构

    目录 1 选择结构 1 1 if else语句 1 2 switch case 语句 1 3 条件运算符 2 循环结构 2 1 whi
  • 直接修改数据库表数据

    直接修改数据库表中的数据 1 写SQL语句 select from 表名 for update 如下图所示 写好SQL后点击执行按钮或者直接按F8 2 执行完SQL后选择行上的按钮 让行信息变成可编辑状态 如下图所示 3 可按增加或者删除一
  • lambda qt 参数 槽函数_Qt界面开发(3)

    参考 QT界面开发 哔哩哔哩 干杯 bilibili www bilibili com 接 juliar Qt界面开发 1 juliar Qt界面开发 2 一 带参数的信号 前面关于信号signal 我们了解到 signals是Qt扩展的关
  • C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http www cnblogs com sthv p 5511921 html http www 169it com article 3215620760 html http www cnblogs com sharpfeng archi
  • js求三个数的最大值和最小值

    如何求三个数的最大值和最小值 var x 9 y 12 c 50 var max x gt y x gt c x c y gt c y c var min x lt y x lt c x c y lt c y c console log m
  • Sharp Memory LCD (ls013b7dh03)驱动

    lcd main c include ls013b7dh03 h include oled font h void lcd main void lcd init lcd clear lcd print char 16 16 a 16 1 l
  • typeAliases设置别名会爆红?sql映射写sql语句没有提示?

    typeAliases设置别名会爆红 明明设置了别名 为什么还是爆红
  • 【MVC】快递信息管理系统

    文章目录 项目介绍 开发环境 技术栈 使用说明 技术要求 思路过程 难点及解决方法 效果展示 总结 项目介绍 该项目主要介绍基于快递信息的增删改查 什么是MVC MVC是三个单词的首字母缩写 它们是Model 模型 View 视图 和Con
  • QT信号和槽的实现原理

    信号和槽是qt用于对象之间通信的核心机制 其目的类似于当一个动作发生的时候 需要对这个动作做出相应的处理 类似的还有借助于函数指针的回调机制 通过回调函数完成对此动作的操作 但是如果对一个庞杂的系统 这种回调函数的维护是相当的麻烦和危险的
  • 聚簇索引、二级索引、非聚簇索引 ?

    聚簇索引与非聚簇索引分别是MySQL不同存储引擎组织索引和数据存储的两种不同方式 按照官方文档的说法 InnoDB里面 除了聚簇索引之外其他都是二级索引 也就是没有非聚簇索引 而MyISAM使用的索引都是非聚簇索引 聚簇索引 将记录和文件一
  • Visual Studio项目属性配置

    此处的 项目属性 指的是菜单栏中 项目 下拉列表中的最后一个选项呈现的内容 界面如下图所示 首先要说明的是 配置项目属性不仅仅只有从菜单栏中选择这一种方法 还可以在 属性管理器 中进行配置 后者的优势在于 一个常用的 完整的属性配置可以方便
  • java web tcp 长连接_netty通过websocket实现服务器与客户端的长连接

    server端代码import com chinadaas bio chinadaasbio webSocket handler ServerHandler import io netty bootstrap ServerBootstrap