使用Netty搭建WebSocket服务器

引入netty的依赖

 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.75.Final</version></dependency>

使用netty创建WebSocketServer

public class WebSocketServer {public static void main(String[] args) throws InterruptedException {//创建两个线程组EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup(); //8个NioEventLooptry {ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup);serverBootstrap.channel(NioServerSocketChannel.class);serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();//因为基于http协议,使用http的编码和解码器pipeline.addLast(new HttpServerCodec());//http是以块方式写,添加ChunkedWriteHandler处理器pipeline.addLast(new ChunkedWriteHandler());//http数据在传输过程中是分段, HttpObjectAggregator ,就是可以将多个段聚合 2. 这就就是为什么,当浏览器发送大量数据时,就会发出多次http请求pipeline.addLast(new HttpObjectAggregator(8192));pipeline.addLast(new WebSocketServerProtocolHandler("/hello"));//自定义的handler ,处理业务逻辑pipeline.addLast(new WebSocketFrameHandler());}});//启动服务器ChannelFuture channelFuture = serverBootstrap.bind(7000).sync();channelFuture.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

创建WebSocket信息的接受处理器

//这里 TextWebSocketFrame 类型,表示一个文本帧(frame)
public class WebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {System.out.println("服务器收到消息 " + msg.text());//回复消息ctx.channel().writeAndFlush(new TextWebSocketFrame("服务器时间" + LocalDateTime.now() + " " + msg.text()));}//当web客户端连接后, 触发方法@Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {//id 表示唯一的值,LongText 是唯一的 ShortText 不是唯一System.out.println("handlerAdded 被调用" + ctx.channel().id().asLongText());}@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {System.out.println("handlerRemoved 被调用" + ctx.channel().id().asLongText());}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {System.out.println("异常发生 " + cause.getMessage());ctx.close(); //关闭连接}
}

创建客户端发送WebSocket消息

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>var socket;//判断当前浏览器是否支持websocketif (window.WebSocket) {//go onsocket = new WebSocket("ws://localhost:7000/hello");//相当于channelReado, ev 收到服务器端回送的消息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) { //先判断socket是否创建好return;}if (socket.readyState == WebSocket.OPEN) {//通过socket 发送消息socket.send(message)} else {alert("连接没有开启");}}
</script>
<form onsubmit="return false"><textarea name="message" style="height: 300px; width: 300px"></textarea><input type="button" value="发送消息" onclick="send(this.form.message.value)"><textarea id="responseText" style="height: 300px; width: 300px"></textarea><input type="button" value="清空内容" onclick="document.getElementById('responseText').value=''">
</form>
</body>
</html>

服务端发送消息

服务端根据WebSocketFrameHandler#channelRead0接受到消息,发送消息是执行ctx.channel().writeAndFlush(new TextWebSocketFrame("服务器时间" + LocalDateTime.now() + " " + msg.text()));

    @Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {System.out.println("服务器收到消息 " + msg.text());//回复消息ctx.channel().writeAndFlush(new TextWebSocketFrame("服务器时间" + LocalDateTime.now() + " " + msg.text()));}

【Netty系列】使用Netty搭建WebSocket服务器相关推荐

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

    文章目录 简介 netty中的websocket websocket的版本 FrameDecoder和FrameEncoder WebSocketServerHandshaker WebSocketF ...

  2. 【读后感】Netty 系列之 Netty 高性能之道 - 相比 Mina 如何 ?

    [读后感]Netty 系列之 Netty 高性能之道 - 相比 Mina 如何 ? 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...

  3. 在IIS上搭建WebSocket服务器(三)

    在IIS上搭建WebSocket服务器(三) 原文:在IIS上搭建WebSocket服务器(三) 编写客户端代码 1.新建一个*.html文件. ws = new WebSocket('ws://19 ...

  4. websocket 学习--简单使用,nodejs搭建websocket服务器,到模拟股票,到实现聊天室

    websocket简介: WebSocket协议是 HTML5 开始提供的一种基于TCP的一种新的全双工通讯的网络通讯协议.它允许服务器主动发送信息给客户端. 和http协议的不同?? HTTP 协议 ...

  5. 项目实战-物联网平台搭建-搭建websocket服务器(三)

    项目目前是有手机app 做客户端,通过app订阅主题并发送消息,mqtt服务器会将数据转存如mysql数据库中,然后再由ws服务端发送到前端展示 下边是大二写的一个mqtt通信app 客户端给温度主题 ...

  6. netty系列之:netty架构概述

    文章目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架 ...

  7. netty系列之:netty初探

    文章目录 简介 netty介绍 netty的第一个服务器 netty的第一个客户端 运行服务器和客户端 总结 简介 我们常用浏览器来访问web页面得到相关的信息,通常来说使用的都是HTTP或者HTTP ...

  8. Netty系列之Netty基础概念与组件

    什么是Netty,Netty各个组件介绍 本部分转载自 Java技术债务[什么是Netty?为什么使用Netty?Netty有哪些组件?] 原文链接:https://blog.csdn.net/qq_ ...

  9. 【Netty系列】Netty百万级推送服务设计要点

    一. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

最新文章

  1. 测试ESP32S基本模块的功能,并验证是否可以应用在AI智能车竞赛检测激光信号中
  2. Oracle服务扫描工具Oscanner
  3. python专科就业难吗-python好就业吗
  4. plsq如何快捷整理代码_我收藏的几个更快搬砖的vscode快捷键
  5. NYOJ--927--dfs--The partial sum problem
  6. 机器学习算法平台alink_Alink漫谈(十二) :在线学习算法FTRL 之 整体设计
  7. jeecg框架日常开发问题解决方法
  8. VC++用异或(XOR)方式实现拖放画动态直线
  9. 第 7 章 使用filter过滤请求
  10. 主题桌面 树莓派4b经典_用树莓派4b构建深度学习应用(一)硬件篇
  11. python Asyncore.dispatcher 理解
  12. 前端json转对象和数组
  13. 内窥镜胶囊(胶囊内镜)硬件方案(二)
  14. 苹果iphone APP界面设计尺寸官方版
  15. 梦想学院计算机,菲梦学院电脑版
  16. 收发EtherCAT帧——ecx_recvpkt
  17. matlab导入表格画图,matlab从excel表格导入数据画图-在matlab上如何导入excel表格然后画图...
  18. 0和1的艺术,与、或、非基本逻辑门电路
  19. 吴英雷 php,2015年01月05日php就业班(第34期)(老888师)
  20. 堪称神级的开源笔记应用!

热门文章

  1. 什么镜头最适合拍风景_【相机配件】谈谈佳能有哪些适合拍风景和人像的好镜头...
  2. vba 判断闰年函数
  3. 数据挖掘学习笔记(一)
  4. python实现坐标系转换_(数据科学学习手札60)用Python实现WGS84、火星坐标系、百度坐标系、web墨卡托四种坐标相互转换...
  5. php libiconv close_PHP 編譯安裝時出現 undefined reference to `libiconv' 錯誤的解決方法
  6. ceph集群和数据库到底是储存数据_Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...
  7. 深度调研前端框架Vue、React、Angular、jQuery,附参考模板!
  8. AD19 打印丝印层
  9. java显示汉字乱码怎么办_java中的汉字显示问号乱码怎么解决
  10. 推荐一款非常好用的Excel导入导出工具EasyPoi