上一篇我们简单说了一下netty的基本操作,其实在netty底层,提供了大量的支持服务端和客户端进行通讯的组件,比如像http协议,支持webscoket的整合等,可以很方便的进行使用,当然,我们也可以单纯的使用websocket进行客户端和服务端的通信,可根据业务场景和自己项目的情况进行选择,下面来实现一个通过页面发送消息到netty服务端,再有服务端推送消息给客户端的功能,

整个部分分为2步,我们先进行服务端代码编写,根据上一篇我们使用的经验,服务端启动主要包括三个类,1、初始化连接配置 2、自定义childHandler 3、自定义业务逻辑处理

1、pom依赖文件:

        <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>5.0.0.Alpha2</version><!-- <version>4.1.24.Final</version> --></dependency>

2、netty初始化启动配置线程组信息:

package com.congge.sort.netty.day2;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;/*** 服务端* @author asus**/
public class WssServer {public static void main(String[] args) {EventLoopGroup mainGroup = new NioEventLoopGroup();EventLoopGroup subGroup = new NioEventLoopGroup();try {ServerBootstrap server = new ServerBootstrap();server.group(mainGroup, subGroup).channel(NioServerSocketChannel.class).childHandler(new WssServerInitialzer());    //添加自定义初始化处理器ChannelFuture future = server.bind(8087).sync();future.channel().closeFuture().sync();} catch (Exception e) {e.printStackTrace();}finally {mainGroup.shutdownGracefully();subGroup.shutdownGracefully();}}}   

3、WssServerInitialzer ,这个类主要配置相应的处理业务的前置信息,比如像和客户端通信,指定相应的通信协议,编码解码信息,自定义相关的handler,其实也可以放在一个代码块儿里面,netty这里使用的类似java设计模式中的责任链模式,可以将所有的自定义或者相关的handler串联起来,对应的就是 : pipeline.addLast ,可以为pipeline添加多个handler

package com.congge.sort.netty.day2;import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
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.stream.ChunkedWriteHandler;public class WssServerInitialzer extends ChannelInitializer<SocketChannel>{@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();//websocket基于http协议,所以需要http编解码器pipeline.addLast(new HttpServerCodec());//添加对于读写大数据流的支持pipeline.addLast(new ChunkedWriteHandler());//对httpMessage进行聚合pipeline.addLast(new HttpObjectAggregator(1024*64));// ================= 上述是用于支持http协议的 ==============//websocket 服务器处理的协议,用于给指定的客户端进行连接访问的路由地址//比如处理一些握手动作(ping,pong)pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));//自定义handlerpipeline.addLast(new ChatHandler());}}

4、下面是我们自定义的handler,这个里面要做的就是处理客户端发送过来的数据,解析数据,并将相应的服务端数据或者业务消息推送给客户端,同时这个类里面,我们可以通过调用netty提供的相应的API,及时捕获到客户端和服务端的连接信息,即所谓的生命周期,可以参照代码和调试的时候看出来,

package com.congge.sort.netty.day2;import java.time.LocalDateTime;import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.concurrent.GlobalEventExecutor;/*** 聊天的ehandler* TextWebSocketFrame  用于为websockt处理文本的对象* @author asus**/
public class ChatHandler extends SimpleChannelInboundHandler<TextWebSocketFrame>{//用于记录和管理所有客户端的channelprivate static ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);@Overrideprotected void messageReceived(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {//客户端传递过来的消息String content = msg.text();System.out.println("接收到了客户端的消息是:" + content);//将客户端发送过来的消息刷到所有的channel中for(Channel channel : clients){//channel.writeAndFlush(msg); channel.writeAndFlush(new TextWebSocketFrame("[服务器接收到了客户端的消息:]" + LocalDateTime.now()+",消息为:" + content));}//        clients.writeAndFlush(
//              new TextWebSocketFrame("[服务器接收到了客户端的消息:]" + LocalDateTime.now()+",消息为:" + content));}//客户端创建的时候触发,当客户端连接上服务端之后,就可以获取该channel,然后放到channelGroup中进行统一管理    @Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {clients.add(ctx.channel());}//客户端销毁的时候触发,@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {//当handlerRemoved 被触发时候,channelGroup会自动移除对应的channel//clients.remove(ctx.channel());System.out.println("客户端断开,当前被移除的channel的短ID是:" +ctx.channel().id().asShortText());}}

5、接下来是客户端代码编写,为了模拟的效果更真实,这里简单写了一个html页面,

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title></title></head><body><div>发送消息</div><input type="text" id="msgContent"/><input type="button" value="点我发送" onclick="CHAT.chat()"/><div>接收消息:</div><div id="receiveMsg" style="background-color: burlywood;"></div><script type="application/javascript">window.CHAT = {socket:null,init:function(){if(window.WebSocket){CHAT.socket = new WebSocket("ws://192.168.111.1:8087/ws");CHAT.socket.onopen = function(){console.log("连接创建成功...");};CHAT.socket.onclose = function(){console.log("连接关闭...");}CHAT.socket.onerror = function(){console.log("连接发生错误...");}CHAT.socket.onmessage = function(e){console.log("接收消息:" + e.data);var receiveMsg = document.getElementById("receiveMsg");var html = receiveMsg.innerHTML;receiveMsg.innerHTML = html + "<br />"+e.data;}}else{alert("浏览器不支持webscoket协议。。。")}},chat:function(){var msg = document.getElementById("msgContent");CHAT.socket.send(msg.value);}}CHAT.init();</script></body>
</html>

页面效果如图:

我们重点关注一下里面的JS,其实就是创建了一个wensocket的对象,然后可以将文本框输入内容发送出去,

6、启动服务端,可以看到控制台输出了内容,表示连接服务端成功,然后我们再发送一条消息给服务端,

服务端控制台收到了客户端的消息:

同时服务端将消息推回给了客户端:

这时我们断开服务端的连接,客户端捕捉到了连接断开的消息,当然,

当然,如果我们关闭浏览器,服务端也可以看到捕捉到这个客户端连接断开的信息,利用netty的这种生命周期相关的API可以在此做一些比如聊天室好友上下线的提示等…

到此,netty使用websocket基本结束,感谢观看!

netty整合使用webscoket相关推荐

  1. Netty游戏服务器实战开发(6):Netty整合Zookeeper实现分布式服务发现与注册

    1:Zookeeper基础 安装zookeeper.当然,很多时候我们会在Windows上开发,所以,我们需要在本地搭建一个zookeeper环境.方便开发过程中的测试. 首先我们去Apache上下载 ...

  2. websocket性能低?教你使用netty整合websocket(二)——实现点对点聊天(客户端与客户端通信)

    前提 了解如何实现客户端和服务端通讯 上一篇博客--SpringBoot+Netty整合websocket(一)--客户端和服务端通讯 实现点对点聊天 后端 1.建立服务端WebSocketNetty ...

  3. Netty整合SpringMVC,实现高效的HTTP服务请求

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/shzy1988/article/ details/78841140 首先,你必须要了解netty ...

  4. netty整合shiro,报There is no session with id [xxxxxx]问题定位及解决

    问题描述: ##### 在做netty和shiro整合测试时,程序启动并正常运行一段时间之后会发现shiro出现异常,异常信息为There is no session with id [xxxxxx] ...

  5. netty整合websocket支持自签证书出现netty websocket ssl Received fatal alert: certificate_unknown

    自签证书 win+r cmd 生成自己jks文件,指向自己要生成jks的文件位置下,我直接生成到项目resources下 #换成自己的本地ip keytool -genkey -alias serve ...

  6. springboot和netty整合的web聊天室

    目录酱 一.新建工程 二.项目文件 三.总结 参考链接 一.新建工程 点击File–>New–>project–>Spring Inittialiar 修改文件名和java版本 选择 ...

  7. springboot和netty整合的聊天室

    一.新建工程 各部分代码: NettychathatApplication: package com.example.nettychat;import org.springframework.boot ...

  8. springboot和netty整合的聊天室--群聊

    一.创建项目 file-new-project-spring initializr-next 然后 添加这两个依赖 二.代码 DemoApplication package com.example.d ...

  9. Netty整合Disruptor实战

    1.Netty实现服务端与客户端数据传输 1).依赖 <dependency><groupId>io.netty</groupId><artifactId&g ...

最新文章

  1. Pandas批量删除dataframe列名中的前缀实战:使用lstrip函数批量删除列名中的前缀(prefix)、使用replace函数批量删除列名中的前缀(prefix)
  2. Rancher第一款Kubernetes操作系统推出
  3. 你在中国有去过那些地区?
  4. C语言实现lu分解lu decompose算法(附完整源码)
  5. Java 线程的 5 种状态
  6. struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式
  7. 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言概念辨析
  8. scala调用java库_从scala调用java时的java.lang.IllegalAccessError – solutions / workarounds?...
  9. 编写SQL Server数据库对象脚本的方法
  10. 抛开当下的迷惘,IT技术人的发展之路该怎么走?
  11. python怎么用pip安装numpy_python如何安装numpy
  12. java 获取全球国家名称,语言,简称
  13. 总结一下关于扫描电子显微镜与背散射电子探测器
  14. matlab 频域响应,利用MATLAB软件分析系统的频率响应
  15. 科技人才开发效率的空间杜宾模型分析
  16. ZBrush:笔刷基础
  17. 映射远程盘或文件夹为本地盘符
  18. 关于lvm扩容的方式
  19. 移动端H5页面生成图片解决方案
  20. 灰流丽能无效融合么_游戏王:史上最强融合卡片,不可阻挡,无法逆转!

热门文章

  1. 第七章——DMVs和DMFs(4)——用DMV和DMF监控磁盘IO
  2. ORACLE监听问题
  3. 如何安装Windows操作系统(五)驱动安装
  4. Wolf QOS 教程
  5. In和exists使用及性能分析(一):in的使用
  6. ceph rbd resize之后文件系统的调节
  7. 【noi 2.6_3531】判断整除(DP)
  8. php中将SimpleXMLElement Object数组转化为普通数组
  9. easyui和My97DatePicker结合使用报“权限错误”的问题
  10. 分析器错误信息: 未能加载类型命名空间.类... ---小结