Netty 常用的场景:

    1.充当HTTP 服务器,但Netty 并没有遵循servlet 的标准,反而实现了自己的一套标准进行Http 服务;

    2,RPC 远程调用,在分布式系统中常用的框架

    3.Socket 长连接

 

需要了解的名词

 1.NioEventLoopGroup: 对线程的控制,线程组,事件循环组,死循环,需要定义两个线程组,一个只用于接收客户端的请求,一个负责具体的处理

 2.Bootstrap :对服务启动的封装,可以很轻松的启动服务管道,进行服务的启动

 3.Channel:渠道,每一个请求都会形成一个渠道

 4.initChannel:连接一旦被创建,就会执行initChannel方法

 5.ChannelPipline:连接的管道,里面装有很多的ChannelHandler处理器(第6)

 6.ChannelHandler:定义我们自己的处理器,因为流程进行到这里我们的请求已经进来了,需要我们进行自己的逻辑处理与响应,相当于filter 一样; netty也提供了很多的处理器;

 7.ByteBuf:很重要,以后详细讲解

 8.ChannelGroup :用来存放一个一个的Channel 对象的Channel 组 ,可以通过  new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);进行获取

接下来是示例代码:我们目前刚接触,我们先不用管它里面具体怎么实现的,只要先对netty 有一个全局的认识,知道它的执行流程就可以,知道执行流程后再深入学习每一步的作用,这样我们就不会太迷茫

基本上,所有netty 编程中都会遵循以下三点:

  1. 创建线程组,即EventLoopGroup

  2.进行服务启动类,即bootstrap

  3.针对自己的业务,创建自己的Handler

1.我们的启动类

public class WebSocketService {

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

        //一样,定义线程组
EventLoopGroup boosGroup =new NioEventLoopGroup();
EventLoopGroup workGroup =new NioEventLoopGroup(); //服务启动类
try
{
ServerBootstrap bootstrap=new ServerBootstrap();
bootstrap.group(boosGroup,workGroup)
.channel(NioServerSocketChannel.class)
//添加日志
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new WebSocketInitializer()); //端口绑定
ChannelFuture channelFuture=bootstrap.bind(9077).sync();
channelFuture.channel().closeFuture().sync();
}
finally {
boosGroup.shutdownGracefully();
workGroup.shutdownGracefully(); } }
}

2.初始化器,用来存放Hander 的

/**
* initializer 初始化器
* @author cys
*
*/
public class WebSocketInitializer extends ChannelInitializer<SocketChannel> { @Override
protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pip =ch.pipeline(); //=====websocket 是基于http协议基础之上的,所以要有http的支持=======//
//编解码器
pip.addLast(new HttpServerCodec());
//对大数据的支持
pip.addLast(new ChunkedWriteHandler());
// 对httpMessage进行聚合,聚合成FullHttpRequest或FullHttpResponse
// 几乎在netty中的编程,都会使用到此hanler
pip.addLast(new HttpObjectAggregator(1024*64)); //This handler does all the heavy lifting for you to run a websocket server.
//这个handler 做了所有的繁重的工作,对于你运行的websocket服务器
//处理了frame 的 close ping pang binary text ,运行中并带到下一个关于你的实现的handler
pip.addLast(new WebSocketServerProtocolHandler("/ws"));//===>ws://localhost:8066/ws //自定义自己的处理类,WebSocketServerProtocolHandler 会将数据帧带到你的handler中 pip.addLast(new WebSocketMyHandler()); } }

3.定义自己的Handler ,也就是自己的逻辑处理

/**
* webSocket 自定义handler
* webSocket 对于数据的传输都是基于Frame(帧)的 ,关于frame 一共有五种类型,遵循RFC标准,netty 实现了这五种标准,所有netty 对websocket 有很好的支持
* 1.BinaryWebSocketFrame
* 2.TextWebSocketFrame
* 3.PongWebSocketFrame
* 4.PingWebSocketFrame
* 5.CloseWebSocketFrame
* ping、pong 的操作,对应的是 WebSocket 的两个控制帧 ==心跳
*
* @author cys
*
*/
public class WebSocketMyHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { //当前的channel 组
private static ChannelGroup channelGroup =new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); @Override
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { Channel ch =ctx.channel();
//msg.text()接收客户端的消息
String text=msg.text();
System.out.println("收到消息"+text);
for(Channel self :channelGroup) { if(ch ==self) {
ch.writeAndFlush(new TextWebSocketFrame("我:===>"+text)); }
else {
self.writeAndFlush(new TextWebSocketFrame(ch.remoteAddress()+"===>"+text));
}
} } /**
* 当有新的Channel连接 时候会触发
*/
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception { Channel ch = ctx.channel(); channelGroup.writeAndFlush(new TextWebSocketFrame(ch.remoteAddress()+"---上线"));
System.out.println(ch.remoteAddress()+"已经连接");
channelGroup.add(ctx.channel());
} /**
* 连接断开的时候触发
*/
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { Channel ch = ctx.channel(); System.out.println(new TextWebSocketFrame(ch.remoteAddress()+"已经断开"));
channelGroup.writeAndFlush(ch.remoteAddress()+"---下线");
} /**
* 出现异常时候触发,关闭当前连接
*/ @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.channel().close();
} }

4.因为websocket 是基于HTML5的,所以客户端就是我们支持websocket的浏览器,

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>web socket连接</title>
</head>
<body> <div>发送消息</div>
<input type="text" id="msgContent"/>
<input type="button" value="send" onclick="CHAT.chat()"/>
<div>接收消息</div>
<div id="reciveMsg" style="background-color:pink"></div> <script type="text/javascript"> window.CHAT ={
socket:null,
init: function(){
if(window.WebSocket){
CHAT.socket =new WebSocket("ws://10.9.121.91:9077/ws");
CHAT.socket.onopen = CHAT.onopen,
CHAT.socket.onclose =CHAT.onclose,
CHAT.socket.onerror =CHAT.onerror,
CHAT.socket.onmessage =CHAT.onmessage }
else{
alert("不支持socket");
}
},
chat: function(){
//消息发送
var content =document.getElementById("msgContent"); if (CHAT.socket != null
&& CHAT.socket != undefined
&& CHAT.socket.readyState == WebSocket.OPEN) {
CHAT.socket.send(content.value);
} else {
// 重连websocket
CHAT.init(); } }
,
//客户端与服务器链接触发
onopen :function(){ console.log("链接已经链接"); },
onclose :function(){
console.log("链接已经关闭");
}, onerror:function(){
console.log("出现错误"); },
onmessage:function(e){ console.log("链接消息");
var reciveMsg =document.getElementById("reciveMsg");
var html =reciveMsg.innerHTML;
reciveMsg.innerHTML =html+"<br/>"+e.data; } } CHAT.init(); </script> </body>
</html>

  

 

 

Netty---入门程序,搭建Websocket 服务器的更多相关文章

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

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

  2. 【Netty】(7)---搭建websocket服务器

    [Netty](7)---搭建websocket服务器 说明:本篇博客是基于学习某网有关视频教学. 目的:创建一个websocket服务器,获取客户端传来的数据,同时向客户端发送数据 一.服务端 1. ...

  3. 【C#】MVC项目中搭建WebSocket服务器

    前言 因为项目需要,前端页面中需要不断向后台请求获取一个及一个以上的状态值.最初的方案是为每个状态值请求都建立一个定时器循环定时发起Ajax请求,结果显而 易见.在HTTP1.1协议中,同一客户端浏览 ...

  4. Netty权威指南之Netty入门程序

    package com.hjp.netty.netty; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Chan ...

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

    编写客户端代码 1.新建一个*.html文件. ws = new WebSocket('ws://192.168.85.128:8086/Handler1.ashx?user=' + $(" ...

  6. Netty(一)——Netty入门程序

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7447618.html 有兴趣的可先了解下:4种I/O的对比与选型 主要内容包括: Netty开发环境的搭建 ...

  7. Netty入门程序(四)

    maven创建project,引入依赖: <dependency> <groupId>io.netty</groupId> <artifactId>ne ...

  8. 在IIS上搭建WebSocket服务器(一)

    一.搭建环境 1.System.Web.WebSockets需搭建在Windows8及Server2012以上系统的上. 2.在Windows8及Server2012以上系统的上安装IIS和WebSo ...

  9. 在IIS上搭建WebSocket服务器(二)

    服务器端代码编写 1.新建一个ASP.net Web MVC5项目 2.新建一个“一般处理程序” 3.Handler1.ashx代码如下: using System; using System.Col ...

随机推荐

  1. 使用curator框架简单操作zookeeper 学习笔记

    Curator 操作是zookeeper的优秀api(相对于原生api),满足大部分需求.而且是Fluent流式api风格. 参考文献:https://www.jianshu.com/p/70151f ...

  2. 通过SSH克隆远程仓库(GitLab)到本地

    由于不是任何用户都能从远程仓库克隆到本地的,也是需要鉴别的,因此本地需要用git bash 创建一个公钥,而远程仓库也要把这个公钥保存下来,进而本地才可以从远程download.主要步骤如下: 1.首 ...

  3. sql server 2008 数据库可疑的解决步骤

    备份并新建同名数据库,并替换原数据文件 1 把问题数据库备份后直接删除 停掉SQLSERVER服务,把服务器上出问题的数据库, 假设名称为 test的数据库文件及日志文件备份到其他目录,然后直接将其删 ...

  4. 正则表达式(Python)

    课题 使用正则表达式匹配字符串 使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89" 返回匹配结果:'" ...

  5. .NET 基础知识

    .net程序基本编写.执行流程(c#)       1>编写c#代码,保存为.cs文件.       2>通过csc.exe程序来将.cs文件编译为.net程序集(.exe或.dll).此 ...

  6. .Net编译原理简单介绍

    首先简单说一下计算机软件运行.所谓软件运行,就是一步一步做一些事情.计算机只认识0和1.给计算机下命令,只能是0与1的方式,确切的说,其实是CPU只认识0和1,因为软件运行是CPU控制的.人直接操作0 ...

  7. Java泛型类型擦除以及类型擦除带来的问题

    目录 1.Java泛型的实现方法:类型擦除 1-2.通过两个例子证明Java类型的类型擦除 2.类型擦除后保留的原始类型 3.类型擦除引起的问题及解决方法 3-1.先检查,再编译以及编译的对象和引用传 ...

  8. C# windows服务:如何检测指定的Windows服务是否启动

    public void CheckServerState(string ServiceName) { ServiceController[] service = ServiceController.G ...

  9. hadoop-2.7.3完全分布式部署

    一.环境介绍      IP       host JDK linux版本 hadop版本 192.168.0.1 master 1.8.0_111 centos7.2.1511 hadoop-2.7 ...

  10. ELK日志平台

    1.ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch.Logstash和Kibana三个开源工具组成,不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Age ...