Netty实现WebSocket通信案例

WebSocket - Netty服务端构建 文章目录WebSocket - Netty服务端/客户端构建一、概要二、基于Netty构建WebSocket服务端2.1 入门案例2.2 WebSocket相关的Netty内置处理类2.3 SpringBoot整合Netty方案三、WebSocket客户端 - JAVA万事如意,阖家安康 WebSocket - Netty服务端/客户端构建 文章目录 在线websocket测试-online tool-postjson (coolaf.com) WebSocket协议深入探究 - 云+社 阅读详情

Netty开发服务端,HTML实现客户端,实现服务端与客户端的实时交互。

1.存储整个工程的全局配置:

package com.research.netty.WebSocket;

import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

/***
 * 存储整个工程的全局配置
 */
public class NettyConfig {
    /***
     * 存储每一个客户端接入进来时的Channel对象
     */
    public  static ChannelGroup group = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
}

2.接收/处理/响应客户端websocket请求的核心业务处理类

package com.research.netty.WebSocket;

import java.util.Date;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.ChannelMatcher;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
import io.netty.handler.codec.http.websocketx.PingWebSocketFrame;
import io.netty.handler.codec.http.websocketx.PongWebSocketFrame;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker;
import io.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory;
import io.netty.util.CharsetUtil;

/**
 * 接收/处理/响应客户端websocket请求的核心业务处理类
 */
public class MyWebSocketHandler extends SimpleChannelInboundHandler<Object> {

    //握手
    private WebSocketServerHandshaker handshaker;
    private static final String WEB_SOCKET_URL = "ws://localhost:8888/websocket";

    //客户端与服务端创建连接的时候调用
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        NettyConfig.group.add(ctx.channel());
        System.out.println("客户端与服务端连接开启...");
    }

    //客户端与服务端断开连接的时候调用
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        NettyConfig.group.remove(ctx.channel());
        System.out.println("客户端与服务端连接关闭...");
    }

    //服务端接收客户端发送过来的数据结束之后调用
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    //工程出现异常的时候调用
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

    //服务端处理客户端websocket请求的核心方法
    @Override
    protected void messageReceived(ChannelHandlerContext context, Object msg) throws Exception {
        //处理客户端向服务端发起http握手请求的业务
        if (msg instanceof FullHttpRequest) {
            handHttpRequest(context, (FullHttpRequest) msg);
        } else if (msg instanceof WebSocketFrame) { //处理websocket连接业务
            handWebsocketFrame(context, (WebSocketFrame) msg);
        }
    }

    /**
     * 处理客户端与服务端之前的websocket业务
     *
     * @param ctx
     * @param frame
     */
    private void handWebsocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {
        //判断是否是关闭websocket的指令
        if (frame instanceof CloseWebSocketFrame) {
            handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());
        }
        //判断是否是ping消息
        if (frame instanceof PingWebSocketFrame) {
            ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
            return;
        }

        //判断是否是二进制消息,如果是二进制消息,抛出异常(我们这个例子不支持二进制消息)
        if (!(frame instanceof TextWebSocketFrame)) {
            System.out.println("目前我们不支持二进制消息");
            throw new RuntimeException("【" + this.getClass().getName() + "】不支持消息");
        }
        //返回应答消息
        //获取客户端向服务端发送的消息
        String request = ((TextWebSocketFrame) frame).text();
        System.out.println("服务端收到客户端的消息====>>>" + request);
        TextWebSocketFrame tws = new TextWebSocketFrame(new Date().toString()
                + ctx.channel().id()
                + " ===>>> "
                + request);
        //群发,服务端向每个连接上来的客户端群发消息
        NettyConfig.group.writeAndFlush(tws);

    }

    /**
     * 处理客户端向服务端发起http握手请求的业务
     *
     * @param ctx
     * @param req
     */
    private void handHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {
        if (!req.getDecoderResult().isSuccess()
                || !("websocket".equals(req.headers().get("Upgrade")))) {
            sendHttpResponse(ctx, req,
                    new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST));
            return;
        }
        WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
                WEB_SOCKET_URL, null, false);
        handshaker = wsFactory.newHandshaker(req);
        if (handshaker == null) {
            WebSocketServerHandshakerFactory.sendUnsupportedWebSocketVersionResponse(ctx.channel());
        } else {
            handshaker.handshake(ctx.channel(), req);
        }
    }

    /**
     * 服务端向客户端响应消息
     *
     * @param ctx
     * @param req
     * @param res
     */
    private void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest req,
                                  DefaultFullHttpResponse res) {
        if (res.getStatus().code() != 200) {
            ByteBuf buf = Unpooled.copiedBuffer(res.getStatus().toString(), CharsetUtil.UTF_8);
            res.content().writeBytes(buf);
            buf.release();
        }
        //服务端向客户端发送数据
        ChannelFuture f = ctx.channel().writeAndFlush(res);
        if (res.getStatus().code() != 200) {
            f.addListener(ChannelFutureListener.CLOSE);
        }
    }
}

3.初始化连接时候的各个组件

package com.research.netty.WebSocket;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.stream.ChunkedWriteHandler;

/**
 * 初始化连接时候的各个组件
 */
public class MyWebSocketChannelHandler extends ChannelInitializer<SocketChannel> {

   @Override
   protected void initChannel(SocketChannel e) throws Exception {
      e.pipeline().addLast("http-codec", new HttpServerCodec());
      e.pipeline().addLast("aggregator", new HttpObjectAggregator(65536));
      e.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
      e.pipeline().addLast("handler", new MyWebSocketHandler());
   }

}

4.程序的入口,负责启动应用

package com.research.netty.WebSocket;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * 程序的入口,负责启动应用
 */
public class Main {
   public static void main(String[] args) {
      //配置服务端NIO线程组
      EventLoopGroup bossGroup = new NioEventLoopGroup();
      EventLoopGroup workGroup = new NioEventLoopGroup();
      try {
         ServerBootstrap b = new ServerBootstrap();
         b.group(bossGroup, workGroup);
         b.channel(NioServerSocketChannel.class);
         b.childHandler(new MyWebSocketChannelHandler());
         System.out.println("服务端开启等待客户端连接....");
         Channel ch = b.bind(8888).sync().channel();
         ch.closeFuture().sync();
         
      } catch (Exception e) {
         e.printStackTrace();
      }finally{
         //优雅的退出程序
         bossGroup.shutdownGracefully();
         workGroup.shutdownGracefully();
      }
   }
}

5.html

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset = utf-8"/>
      <title>WebSocket客户端</title>
   <script type="text/javascript">
      var socket;
      if(!window.WebSocket){
         window.WebSocket = window.MozWebSocket;
      }

      if(window.WebSocket){
         socket = new WebSocket("ws://localhost:8888/websocket");
         socket.onmessage = function(event){
            var ta = document.getElementById('responseContent');
            ta.value += event.data + "\r\n";
         };

         socket.onopen = function(event){
            var ta = document.getElementById('responseContent');
            ta.value = "你当前的浏览器支持WebSocket,请进行后续操作\r\n";
         };

         socket.onclose = function(event){
            var ta = document.getElementById('responseContent');
            ta.value = "";
            ta.value = "WebSocket连接已经关闭\r\n";
         };
      }else{
         alert("您的浏览器不支持WebSocket");
      }

        window.onbeforeunload = function(){
            ws.close();
        }

      function send(message){
         if(!window.WebSocket){
            return;
         }
         if(socket.readyState == WebSocket.OPEN){
            socket.send(message);
         }else{
            alert("WebSocket连接没有建立成功!!");
         }
      }
   </script>
   </head>
   <body>
      <form onSubmit="return false;">
         <input type = "text" name = "message" value = ""/>
         <br/><br/>
         <input type = "button" value = "发送WebSocket请求消息" onClick = "send(this.form.message.value)"/>
         <hr color="red"/>
         <h2>客户端接收到服务端返回的应答消息</h2>
         <textarea id = "responseContent" style = "width:1024px; height:300px"></textarea>
      </form>
   </body>
</html>

 

---摘自慕课网netty课程

Python爬虫:招聘网站岗位要求、薪资与求职者数据爬取与分析 通过本文的教程,我们学习了如何通过 Python 编写招聘数据爬虫,爬取招聘网站上的岗位要求、薪资和求职者数据,并通过数据存储、清洗、分析和可视化,获取有价值的信息。网站如智联招聘、猎云网、前程无忧等,都提供了大量的招聘信息,包括岗位要求、薪资范围、工作经验、学位要求、招聘公司等。本文将介绍如何通过 Python 编写爬虫,爬取招聘网站上的岗位要求、薪资、求职者数据,并通过数据存储、分析和可视化等手段,为求职者或招聘者提供实用的信息和决策支持。通过循环抓取多个页面的数据,可以获取不同岗位的信息。 阅读详情

相关推荐

Abaqus复合材料层合板仿真

由于复合材料的损伤失效问题过于复杂,解析方法受到数学工具的限制难以实现,而实验也需要高昂的费用和时间成本难以广泛应用,Abaqus针对复合材料提供了专业的建模工具和损伤分析理论来模拟复合材料层合板在各种工况下的失效行为。

JXHXHL的博客 2542

netty学习的一些总结

最近因为工作关系要完成tcp的长链接推送,公司原来选择的是netty框架,就学习一下,怕忘了就做些笔记,实用的是netty5的handleradapter,是对netty4的in和out的handler的升级,现在服务端和客户端都加入的有心跳,来保持连接和服务端消息消费,整合了protobuf协议,进行数据传输,听说protostuff用起来很方便,也跟着写了demo确实很方便, 不知道能不能和

yoyohunter的博客 2907

【Labview】对连续采集数据的一种采样方法

图1如图1,想要对这样一个连续信号进行数据点的采集,我根据网上收集到的方法,在此分享一下最终的结果。可以拓展结合文件的写入,完成对连续信号的采集和输出。 已知: 一个连续信号,如图1. 目标: 设定一定采集点个数、采集点时间间隔、和采集周期次数,得到这条连续信号的数据点,如图2. 图2 方法如下: 主要利用的是队列的方法。 在连续信号生成的时候,不断的写入队列,并且清除队列。 ...

李时珍食疗志的博客 1万+

Netty(四)实现WebSocket

Netty之实现WebSocket用户单聊.... 简单介绍一下webSocket: 我们一直使用的http协议只能由客户端发起,服务端无法直接进行推送,这就导致了如果服务端有持续的变化客户端想要获知就比较麻烦。WebSocket协议就是为了解决这个问题应运而生。WebSocket协议,客户端和服务端都可以主动的推送消息,可以是文本也可以是二进制数据。而且没有同源策略的限制,不存在跨域问题。协议的标识符就是ws。 WebSocket是H5之后提供的一种网络通讯技术,属于应用层协议。它基于 TCP 传

qq_41874088的博客 1805

【一】PCIe基础知识

Linux PCIe基础知识

他山之石 可以攻玉 4万+

GAN模型中的常见变体有哪些,如DCGAN、WGAN和CGAN等?

生成对抗网络(GAN)是一种强大的深度学习模型,它由生成器和判别器两个网络组成,通过对抗训练的方式实现生成数据的能力。随着研究的发展,出现了许多GAN的变体,每个变体都有其独特的改进和特点。

huidhsu的博客 2262

Netty源码分析-采坑ChannelInboundHandlerAdapter当中msg必须释放

在Netty开发当中,需要自定义ChannelInboundHandlerAdapter,在重写channelRead时会传入msg对象,此对象在使用完毕后必须释放,否则会导致对象池泄露内存溢出。 @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { try { // Do ...

大新博客 3821

学习笔记【Day 20】鸿蒙PC应用在SD WAN MSTP场景用CodeArts test工具测试过程

多生成树协议(MSTP)作为二层网络高可靠、无环路的核心技术,其在鸿蒙 PC 上的兼容性与稳定性测试尤为重要。本文结合华为云 CodeArts TestPlan 全流程测试管理平台,详细拆解鸿蒙 PC 端 MSTP 功能的测试设计、环境搭建、执行验证。1.测试左移,保障迭代效率CodeArts TestPlan 将 MSTP 测试从后期集成阶段 “左移” 至开发早期,通过可复用用例库与自动化脚本,支持每次代码提交后的快速回归测试,避免网络功能稳定性因迭代被破坏。2.平台化工具破解复杂场景测试难题。

aiyijianghe的博客 1059

吃透Netty源码系列四十九之WebSocket编解码器详解二

吃透Netty源码系列四十九之WebSocket编解码器详解二Utf8FrameValidatorWebSocketServerProtocolHandlerdecodeWebSocketProtocolHandler的decodeWebSocket08FrameEncoder解码器 Utf8FrameValidator 今天把剩下的一些说下,这个是验证文本帧是否是UTF8编码的。来看下吧。其实他...

王伟王胖胖的博客 2207

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 489

让 PyCharm 代码“发光”:高亮插件与特效全攻略

PyCharm 作为一款强大的 Python IDE,支持多种插件让代码“发光”——无论是动态输入特效、彩虹括号,还是霓虹主题,都能让你的代码脱颖而出!进入 File → Settings → Editor → Color Scheme → Rainbow Brackets。进入 File → Settings → Appearance & Behavior → Material Theme。进入 File → Settings → Editor → Color Scheme → General。

qq_43580271的博客 3840

netty+websocket实现给指定用户发消息(指定id)+源码分析

Introduction 在使用netty向指定客户端发送消息的时候,应该需要怎么做呢? 方案 首先我们需要认识Netty的主要构件: Channel 回调 Future 事件和ChannelHandle 在不考虑分布式netty的情况下,我们知道 netty的处理模型是存在一组IO线程,去处理IO事件,如read,connect,write等等,对于服务端接收到的每个channel,都会将该channel映射到一条IO线程。当一个channel被建立之后,需要将其初始化,包含给他创建pipleli

weixin_43180484的博客 4452

RK3568平台开发系列讲解(NPU篇)什么是RKNPU

📢本篇章将介绍RKNPU。

内核笔记 4359

【基于Netty实现WebSocket通信代码&基于WebSocket通信实现简单的群聊天室案例实战学习】

【基于Netty实现WebSocket通信代码&基于WebSocket通信实现简单的群聊天室案例实战学习】WebSocket ——一种在2011 年被互联网工程任务组(IETF)标准化的协议。WebSocket解决了一个长期存在的问题:既然底层的协议(HTTP)是一个请求/响应模式的交互序列,那么如何实时地发布信息呢?AJAX提供了一定程度上的改善,但是数据流仍然是由客户端所发送的请求驱动的。WebSocket规范以及它的实现代表了对一种更加有效的解决方案的尝试。

Coder_ljw的博客 1288

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ESP32舵机控制从入门到进阶:PWM原理、多路同步与电源设计实战

PWM信号通过调节占空比实现舵机角度精确控制,其本质是周期20ms方波中高电平脉宽决定目标位置。ESP32凭借硬件LEDC模块、双核240MHz主频及丰富GPIO资源,可稳定驱动多路舵机并同步处理WiFi通信与传感器融合。在机器人、云台、智能小车等场景中,多舵机协同对电源设计与信号质量提出更高要求,独立供电、共地处理及去耦电容是保障系统稳定的关键。本文深入解析ESP32舵机控制中PWM原理、多路同步、角度平滑插值及电源抗干扰等核心技术,帮助开发者构建可靠的多舵机控制系统。

weixin_33843947的博客 312

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java网络编程(8) - 怎么样使用NettyUDP协议通信?怎么样使用Netty的WebSocket通信案例?

Netty使用UDP协议通信案例 UDP(User Datagram Protocol)即用户数据包协议,是OSI(Open Sysem Interconnection,开放式系统互联)模型的一种无连接的传输层协议,提供面向事务的简单不可靠信息传输服务。 在网络中与TCP协议一样,用于处理数据包,是一种无连接信息,不关系数据包,只关注是否发出数据包,UDP有不提供数据包分组、组装,和不能对数据包进行排序的缺点。也就是说,当报文发送之后,是无法得知是否安全完整到达的。 ...

Su_Levi_Wei的博客 739

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WebSocket,Socket,Http之间的区别及使用Netty实现WebSocket服务端

WebSocket(转自优快云博客王卫东) WebSocket介绍与原理 WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。 ——百度百科 目的:即时通信,替代轮询   网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等。按照以往的技术能力通常是采用轮询、Comet技术解决。 ...

ZloveH______的博客 9493

netty案例,netty4.1中级拓展篇五《基于Netty搭建WebSocket,模仿微信聊天页面》

前言介绍 本章节我们模仿微信聊天页面,开发一个基于Netty搭建WebSocket通信案例。Netty的应用方面非常广;聊天、MQ、RPC、数据等等,在5G到来的时候更加需要大量数据传输,Netty的应用也会更加广阔。 1、这个案例使用SpringBoot+Netty+WebSocket搭建功...

chitao0873的博客 355

用WebSocket实现后端消息实时推送到前端

1.前端调用WebSocket server代码: //调用WebSocket server batchSeting() { this.openStatue = 1; const serve = window.location.hostname; this.websock = new WebSocket(`ws://${serve}:8088/e...

weixin_43128990的博客 9868

springboot基于netty加websocket实现高性能IM系统案例(2)

上一节我们简单介绍了一下im的一些基础概念和技术,这一节我们来说一下聊天流程的具体实现和相关代码从上面代码,大家可能感到疑惑,为什么remove时要加锁?为什么在websocket不能直接注解注入对象?这个我们放到下期来讲,同时下期会给大家补充一下心跳包和断线重连以及一些其它业务,等个人项目完成后,相关代码都会开源,敬请期待。

zy11517的博客 1205

Nginx+netty+websocket

记录一次nginx部署的 netty+websocket消息通知 前端 vue //导入的包 import io from 'socket.io-client' webSocketLink() { let socket; if (!window.WebSocket) { window.WebSocket = window.MozWebSocket; } if (window.WebSocket) { //例子:socket = n

weixin_44155097的博客 2044

java websocket客户端 心跳_WebSocket 实现 Web 端即时通信

点击上方好好学java,选择星标公众号重磅资讯、干货,第一时间送达今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~前言WebSocket 是HTML5开始提供的一种在浏览器和服务器间进行全双工通信的协议。目前很多没有使用WebSocket进行客户端服务端实时通信的web应用,大多使用设置规则时间的轮询,或者使用长轮询较多来处理消息的实时推送。这样势...

weixin_39915505的博客 543

上万字全面解读websocket(多种实现方案,含集群实现代码)

提供多种websocket实现方案,包括集群模式的解决,附详细代码,轻松掌握websocket。

文艺青年学编程 2766

Netty之WebSocket和四种IO介绍

Netty简介   一、什么是netty?       高性能 事件驱动       异步非堵塞 基于NIO的客户端,服务器端编程框架       稳定性和伸缩性      二、Netty的使用场景       高性能领域       多线程并发领域       异步通信领域 四种IO介绍   1、BIO通信     (1)一个线程负责连接     (2)一个请求一...

weixin_30702413的博客 229

websocket+netty实时视频弹幕交互功能(Java版)

2021年了,还有不支持弹幕的视频网站吗,现在各种弹幕玩法层出不穷,抽奖,ppt都上弹幕玩法了,不整个弹幕都说不过去了,今天笔者就抽空做了一个实时视频弹幕交互功能的实现,不得不说这样的形式为看视频看直播,讲义PPT,抽奖等形式增加了许多乐趣。 1 技术选型 1.1 netty 官方对于netty的描述: https://netty.io/ 主要关键词描述:netty是异步事件驱动网络框架,可做各种协议服务端,并且支持了FTP,SMTP,HTTP等很多协议,并且性能,稳定性,灵活性都很棒。

Janson_Lin 482

Netty4.x 的逆袭之路 —— 再识 Netty

Netty4.x 的逆袭之路 2020年9月25日 Netty 结合 protobuf 使用 预习 在netty数据传输过程中可以有很多选择,比如;字符串、json、xml、java对象,但为了保证传输的数据具备;良好的通用性、方便的操作性和传输的高性能,我们可以选择protobuf作为我们的数据传输格式。 protobuf Google开发的一个数据格式 202 案例跑通 (失败) 总结 202: 该篇主要讲述 protobuf 传输数据格式在 Netty 中的应用, protobuf 需要自行下载源

586
上一篇: BIO,伪异步IO,NIO,AIO与Netty
下一篇: nginx配置反向代理
JavaMrSun
博客等级 码龄9年 27粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值