websocket的介绍:

WebSocket是一种在网络通信中的协议,它是独立于HTTP协议的。该协议基于TCP/IP协议,可以提供双向通讯并保有状态。这意味着客户端和服务器可以进行实时响应,并且这种响应是双向的。WebSocket协议端口通常是80,443。

WebSocket的出现使得浏览器具备了实时双向通信的能力。与HTTP这种非持久单向响应应答的协议相比,WebSocket是一个持久化的协议。举例来说,即使在关闭网页或者浏览器后,WebSocket的连接仍然保持,用户也可以继续接收到服务器的消息。

此外,要建立WebSocket连接,需要浏览器和服务器握手进行建立连接。一旦连接建立,WebSocket可以在浏览器和服务器之间双向发送或接受信息。总的来说,WebSocket提供了一个高效、实时的双向通信方案。

1、用netty构建websocket服务器

  1. package org.tianfan.websocket;// WebSocketServer.java
  2. import io.netty.bootstrap.ServerBootstrap;
  3. import io.netty.channel.ChannelFuture;
  4. import io.netty.channel.ChannelInitializer;
  5. import io.netty.channel.ChannelPipeline;
  6. import io.netty.channel.EventLoopGroup;
  7. import io.netty.channel.nio.NioEventLoopGroup;
  8. import io.netty.channel.socket.SocketChannel;
  9. import io.netty.channel.socket.nio.NioServerSocketChannel;
  10. import io.netty.handler.codec.http.HttpObjectAggregator;
  11. import io.netty.handler.codec.http.HttpServerCodec;
  12. import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
  13. public class WebSocketServer {
  14. private final int port;
  15. public WebSocketServer(int port) {
  16. this.port = port;
  17. }
  18. public void run() throws Exception {
  19. EventLoopGroup bossGroup = new NioEventLoopGroup();
  20. EventLoopGroup workerGroup = new NioEventLoopGroup();
  21. try {
  22. ServerBootstrap b = new ServerBootstrap();
  23. b.group(bossGroup, workerGroup)
  24. .channel(NioServerSocketChannel.class)
  25. .childHandler(new ChannelInitializer<SocketChannel>() {
  26. @Override
  27. public void initChannel(SocketChannel ch) throws Exception {
  28. ChannelPipeline p = ch.pipeline();
  29. p.addLast(new HttpServerCodec());
  30. p.addLast(new HttpObjectAggregator(65536));
  31. p.addLast(new WebSocketServerProtocolHandler("/websocket"));
  32. p.addLast(new WebSocketServerHandler());
  33. }
  34. });
  35. ChannelFuture f = b.bind(port).sync();
  36. f.channel().closeFuture().sync();
  37. } finally {
  38. workerGroup.shutdownGracefully();
  39. bossGroup.shutdownGracefully();
  40. }
  41. }
  42. public static void main(String[] args) throws Exception {
  43. int port = 8080;
  44. if (args.length > 0) {
  45. port = Integer.parseInt(args[0]);
  46. }
  47. new WebSocketServer(port).run();
  48. }
  49. }

我来解释一下上面的代码:

  • p.addLast(new HttpServerCodec()):添加HTTP服务器编解码器,用于将数据转换成HTTP协议格式进行传输。
  • p.addLast(new HttpObjectAggregator(65536)):添加HTTP对象聚合处理器,用于将HTTP请求或响应中的多个消息片段聚合成完整的消息。
  • p.addLast(new WebSocketServerProtocolHandler("/websocket")):添加WebSocket协议处理器,用于处理WebSocket握手、消息传输等操作。
  • p.addLast(new WebSocketServerHandler()):添加WebSocket处理器,用于处理客户端与服务器端之间的数据交换,实现自定义的业务逻辑。

使用Netty框架中的WebSocketServerProtocolHandler处理器,将HTTP升级为WebSocket协议。它创建了一个新的管道(pipeline)并将WebSocket处理程序添加到管道的尾部,以便处理WebSocket协议的握手和帧。"/websocket"是WebSocket的URI路径,它指定了WebSocket服务的相对地址,该地址将在客户端请求连接时被指定。

  1. package org.tianfan.websocket;
  2. import io.netty.channel.ChannelHandlerContext;
  3. import io.netty.channel.SimpleChannelInboundHandler;
  4. import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
  5. public class WebSocketServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
  6. @Override
  7. public void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
  8. // 处理消息
  9. System.out.println("Received message: " + msg.text());
  10. ctx.channel().writeAndFlush(new TextWebSocketFrame("Server received: " + msg.text()));
  11. }
  12. @Override
  13. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  14. // 添加连接
  15. System.out.println("Client connected: " + ctx.channel());
  16. }
  17. @Override
  18. public void channelInactive(ChannelHandlerContext ctx) throws Exception {
  19. // 断开连接
  20. System.out.println("Client disconnected: " + ctx.channel());
  21. }
  22. @Override
  23. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  24. // 异常处理
  25. cause.printStackTrace();
  26. ctx.close();
  27. }
  28. }

我来解释一下上面的代码:

刚信息发过来的时候,在服务端打印,并写入前端。

2、前端客户端页面:

  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>WebSocket Test</title>
  7. </head>
  8. <body>
  9. <h1>WebSocket Test</h1>
  10. <div>
  11. <input type="text" id="message" placeholder="Message">
  12. <button onclick="send()">Send</button>
  13. </div>
  14. <div id="output"></div>
  15. <script>
  16. var socket = new WebSocket("ws://localhost:8080/websocket");
  17. socket.onopen = function(event) {
  18. console.log("WebSocket opened: " + event);
  19. };
  20. socket.onmessage = function(event) {
  21. console.log("WebSocket message received: " + event.data);
  22. var output = document.getElementById("output");
  23. output.innerHTML += "<p>" + event.data + "</p>";
  24. };
  25. socket.onclose = function(event) {
  26. console.log("WebSocket closed: " + event);
  27. };
  28. function send() {
  29. var message = document.getElementById("message").value;
  30. socket.send(message);
  31. }
  32. </script>
  33. </body>
  34. </html>

运行结果:

netty整合websocket(完美教程)的更多相关文章

  1. netty学习第5章 netty整合websocket

    学习netty之后,可能都有一个疑问,就是如何选择一个编码.解码器,在netty中的编解码可是和json这种编解码是不一样的,netty的编解码器主要是解决TCP粘包.拆包的问题.netty中有许多自 ...

  2. Spring Boot2 系列教程 (十七) | 整合 WebSocket 实现聊天室

    微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 昨天那篇介绍了 WebSocket 实现广播,也即服务器端有消息时,将消息发送给所有连接了当前 endpoint 的浏览器.但 ...

  3. Spring Boot2 系列教程 (十六) | 整合 WebSocket 实现广播

    前言 如题,今天介绍的是 SpringBoot 整合 WebSocket 实现广播消息. 什么是 WebSocket ? WebSocket 为浏览器和服务器提供了双工异步通信的功能,即浏览器可以向服 ...

  4. WebSocket使用教程 2

    WebSocket使用教程 - 带完整实例 收藏 james_laughing 发表于 2年前 阅读 46438 收藏 23 点赞 5 评论 4 摘要: WebSocket使用教程 - 带完整实例 什 ...

  5. Netty入门与实战教程总结分享

    前言:都说Netty是Java程序员必须要掌握的一项技能,带着不止要知其然还要知其所以然的目的,在慕课上找了一个学习Netty源码的教程,看了几章后着实有点懵逼.虽然用过Netty,并且在自己的个人网 ...

  6. netty系列之:使用netty搭建websocket服务器

    目录 简介 netty中的websocket websocket的版本 FrameDecoder和FrameEncoder WebSocketServerHandshaker WebSocketFra ...

  7. netty系列之:使用netty搭建websocket客户端

    目录 简介 浏览器客户端 netty对websocket客户端的支持 WebSocketClientHandshaker WebSocketClientCompressionHandler netty ...

  8. Netty整合STOMP

    1.STOMP协议简介 常用的WebSocket协议定义了两种传输信息类型:文本信息和二进制信息.类型虽然被确定,但是他们的传输体是没有规定的,也就是说传输体可以自定义成什么样的数据格式都行,只要客户 ...

  9. Centos7安装并配置mysql5.6完美教程

    Centos7安装并配置mysql5.6完美教程 Centos7将默认数据库mysql替换成了Mariadb,对于我们这些还想使用mysql的开发人员来说并不是一个好消息.然而,网上关于Linux安装 ...

  10. Struts2+Spring4+Hibernate4整合超详细教程

    Struts2.Spring4.Hibernate4整合 超详细教程 Struts2.Spring4.Hibernate4整合实例-下载 项目目的: 整合使用最新版本的三大框架(即Struts2.Sp ...

随机推荐

  1. C++欧几里得算法求最大公约数和最小公倍数

    定义 最大公约数即为 Greatest Common Divisor,常缩写为 gcd. 一组整数的公约数,是指同时是这组数中每一个数的约数的数. 一组整数的最大公约数,是指所有公约数里面最大的一个. ...

  2. 代码随想录算法训练营第二十九天| 491.递增子序列 46.全排列 47.全排列 II

      491.递增子序列 卡哥建议:本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里.  https://programmercarl.com/0491.%E9%80%92%E5% ...

  3. Hadoop单击模式运行wordcount例子

    1.进入Hadoop安装目录 cd /zwy/soft/hadoop-2.7.1 2.创建文件夹input mkdir input 3.写一段文字到文件file.txt echo "hell ...

  4. oracle-应用连接数激增测试

    在生产环境遇见过表的连接数过高,导致系统宕机的问题,操作上是由于在大表上建立索引,造成全表锁.故手动在表加表级锁,表上的应用不停,查看Oracle数据库连接数是否激增. 1 应用正常运行,查看当前数据 ...

  5. WEB项目开发流程介绍

    web开发流程 web开发流程图 一.需求分析阶段 在需求分析阶段,即上图所述 "需求明确"之前的阶段 产品经理PM召集需要项目相关人员,开需求讨论会.讲解原型 相关人员需要以此了 ...

  6. This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.

    This TensorFlow binary is optimized to use available CPU instructions in performance-critical operat ...

  7. 基于.Net 的 AvaloniUI 多媒体播放器方案汇总

    基于.Net 的 AvaloniUI 多媒体播放器方案汇总 摘要 随着国产化的推进,相信.Net的桌面端的小伙伴的可能已经有感受到了. 为了让.Net的桌面框架能够跨桌面平台,首选的就是Avalona ...

  8. LibOciLib使用说明(2017-1-26更新)

    LibOciLib使用说明 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的! ...

  9. 手撕Vue-数据驱动界面改变下

    经过上一篇的介绍,数据驱动界面改变 v-model 的双向绑定已告一段落, 剩余的就以这篇文章来完成. 首先完成我们的 v-html,v-text, 其实很简单,就是将我们之前的 v-model 创建 ...

  10. Python网页应用开发神器fac 0.2.10版本新功能介绍

    fac项目地址:https://github.com/CNFeffery/feffery-antd-components 欢迎star支持 大家好我是费老师,由我开源维护的Python网页通用组件库f ...