Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)

netty学习二(解决tcp/udp 粘包,拆包问题) 在通讯协议中,粘包,拆包是常发生的事情,而netty则很好的给出了三种解决方式,下面分别介绍: 一;利用LineBasedFrameDecoder解决TCP粘包问题 直接上代码, Client类: package stickorApartPackageResolveOne.one; import io.netty.bootstrap.Bootstrap; import io.nett... 阅读详情

TCP网络通信时候会发生粘包/拆包的问题,接下来探讨其解决之道。

什么是粘包/拆包

一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU(最大传输单元)的往往小于在应用处理的消息数据,所以就会引发一次接收的数据无法满足消息的需要,导致粘包的存在。处理粘包的唯一方法就是制定应用层的数据通讯协议,通过协议来规范现有接收的数据是否满足消息数据的需要。

情况分析

TCP粘包通常在流传输中出现,UDP则不会出现粘包,因为UDP有消息边界,发送数据段需要等待缓冲区满了才将数据发送出去,当满的时候有可能不是一条消息而是几条消息合并在换中去内,在成粘包;另外接收数据端没能及时接收缓冲区的包,造成了缓冲区多包合并接收,也是粘包。

解决办法

1、消息定长,报文大小固定长度,不够空格补全,发送和接收方遵循相同的约定,这样即使粘包了通过接收方编程实现获取定长报文也能区分。

2、包尾添加特殊分隔符,例如每条报文结束都添加回车换行符(例如FTP协议)或者指定特殊字符作为报文分隔符,接收方通过特殊分隔符切分报文区分。

3、将消息分为消息头和消息体,消息头中包含表示信息的总长度(或者消息体长度)的字段

4、更复杂的自定义应用层协议

代码例子

1、Netty中提供了FixedLengthFrameDecoder定长解码器可以帮助我们轻松实现第一种解决方案,定长解码报文。

服务器端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package  im;
 
import  io.netty.bootstrap.ServerBootstrap;
import  io.netty.channel.ChannelFuture;
import  io.netty.channel.ChannelInitializer;
import  io.netty.channel.ChannelOption;
import  io.netty.channel.EventLoopGroup;
import  io.netty.channel.nio.NioEventLoopGroup;
import  io.netty.channel.socket.SocketChannel;
import  io.netty.channel.socket.nio.NioServerSocketChannel;
import  io.netty.handler.codec.FixedLengthFrameDecoder;
import  io.netty.handler.codec.string.StringDecoder;
import  io.netty.handler.logging.LogLevel;
import  io.netty.handler.logging.LoggingHandler;
/**
  * 定长解码  服务器端
  * @author xwalker
  */
public  class  Server {
     
     public  void  bind( int  port)  throws  Exception{
         //接收客户端连接用
         EventLoopGroup bossGroup= new  NioEventLoopGroup();
         //处理网络读写事件
         EventLoopGroup workerGroup= new  NioEventLoopGroup();
         try {
         //配置服务器启动类 
         ServerBootstrap b= new  ServerBootstrap();
         b.group(bossGroup,workerGroup).channel(NioServerSocketChannel. class ).option(ChannelOption.SO_BACKLOG,  100 )
         .handler( new  LoggingHandler(LogLevel.INFO)) //配置日志输出
         .childHandler( new  ChannelInitializer<SocketChannel>() {
             @Override
             protected  void  initChannel(SocketChannel ch)  throws  Exception {
                 ch.pipeline().addLast( new  FixedLengthFrameDecoder( 30 )); //设置定长解码器 长度设置为30
                 ch.pipeline().addLast( new  StringDecoder()); //设置字符串解码器 自动将报文转为字符串
                 ch.pipeline().addLast( new  Serverhandler()); //处理网络IO 处理器
             }
         });
         //绑定端口 等待绑定成功
         ChannelFuture f=b.bind(port).sync();
         //等待服务器退出
         f.channel().closeFuture().sync();
         } finally {
             //释放线程资源
             bossGroup.shutdownGracefully();
             workerGroup.shutdownGracefully();
         }
     }
     public  static  void  main(String[] args)  throws  Exception {
         int  port= 8000 ;
         new  Server().bind(port);
     }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package  im;
 
import  io.netty.buffer.ByteBuf;
import  io.netty.buffer.Unpooled;
import  io.netty.channel.ChannelHandlerAdapter;
import  io.netty.channel.ChannelHandlerContext;
/**
  * 服务器handler
  * @author xwalker
  */
public  class  Serverhandler  extends  ChannelHandlerAdapter {
     int  counter= 0 ;
     private  static  final  String MESSAGE= "It greatly simplifies and streamlines network programming such as TCP and UDP socket server." ;
     @Override
     public  void  channelRead(ChannelHandlerContext ctx, Object msg)
             throws  Exception {
         System.out.println( "接收客户端msg:[" +msg+ "]" );
         ByteBuf echo=Unpooled.copiedBuffer(MESSAGE.getBytes());
         ctx.writeAndFlush(echo);
     }
     
     @Override
     public  void  exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
             throws  Exception {
         cause.printStackTrace();
         ctx.close();
     }
 
}

客户端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package  im;
 
import  io.netty.bootstrap.Bootstrap;
import  io.netty.channel.ChannelFuture;
import  io.netty.channel.ChannelInitializer;
import  io.netty.channel.ChannelOption;
import  io.netty.channel.EventLoopGroup;
import  io.netty.channel.nio.NioEventLoopGroup;
import  io.netty.channel.socket.SocketChannel;
import  io.netty.channel.socket.nio.NioSocketChannel;
import  io.netty.handler.codec.FixedLengthFrameDecoder;
import  io.netty.handler.codec.string.StringDecoder;
/**
  * 客户端 
  * @author xwalker
  *
  */
public  class  Client {
     /**
      * 链接服务器
      * @param port
      * @param host
      * @throws Exception
      */
     public  void  connect( int  port,String host) throws  Exception{
         //网络事件处理线程组
         EventLoopGroup group= new  NioEventLoopGroup();
         try {
         //配置客户端启动类
         Bootstrap b= new  Bootstrap();
         b.group(group).channel(NioSocketChannel. class )
         .option(ChannelOption.TCP_NODELAY,  true ) //设置封包 使用一次大数据的写操作,而不是多次小数据的写操作
         .handler( new  ChannelInitializer<SocketChannel>() {
             @Override
             protected  void  initChannel(SocketChannel ch)  throws  Exception {
                 ch.pipeline().addLast( new  FixedLengthFrameDecoder( 30 )); //设置定长解码器
                 ch.pipeline().addLast( new  StringDecoder()); //设置字符串解码器
                 ch.pipeline().addLast( new  ClientHandler()); //设置客户端网络IO处理器
             }
         });
         //连接服务器 同步等待成功
         ChannelFuture f=b.connect(host,port).sync();
         //同步等待客户端通道关闭
         f.channel().closeFuture().sync();
         } finally {
             //释放线程组资源
             group.shutdownGracefully();
         }
     }
     public  static  void  main(String[] args)  throws  Exception {
         int  port= 8000 ;
         new  Client().connect(port,  "127.0.0.1" );
 
     }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package  im;
 
import  io.netty.buffer.Unpooled;
import  io.netty.channel.ChannelHandlerAdapter;
import  io.netty.channel.ChannelHandlerContext;
/**
  * 客户端处理器
  * @author xwalker
  *
  */
public  class  ClientHandler  extends  ChannelHandlerAdapter {
     private  static  final  String MESSAGE= "Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients." ;
     public  ClientHandler(){}
     @Override
     public  void  channelActive(ChannelHandlerContext ctx)  throws  Exception {
             ctx.writeAndFlush(Unpooled.copiedBuffer(MESSAGE.getBytes()));
     }
     @Override
     public  void  channelRead(ChannelHandlerContext ctx, Object msg)
             throws  Exception {
         System.out.println( "接收服务器响应msg:[" +msg+ "]" );
     }
     
     @Override
     public  void  channelReadComplete(ChannelHandlerContext ctx)  throws  Exception {
         ctx.flush();
     }
     @Override
     public  void  exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
             throws  Exception {
         cause.printStackTrace();
         ctx.close();
     }
}

服务器和客户端分别设置了定长解码器 长度为30字节,也就是规定发送和接收一次报文定长为30字节。

运行结果:

客户端接收到服务器的响应报文 一段文字被定长分成若干段接收。

服务器端接收客户端发送的报文 一段话也是分成了等长的若干段。

上述是一个简单长字符串传输例子,将一个长字符串分割成若干段。我们也可以自定义一系列定长的指令发送出去

例如指令长度都是30个字节,批量发出N条指令,这样客户端粘包后发出一个比较大的数据指令集,服务器接收到的数据在缓冲区内,只需要按照定长一个个指令取出来执行即可。

java实现基于netty 的udp字节数据接收服务 java实现基于netty 的utp字节数据接收服务,服务具体实现代码。样例java实现基于netty 的utp字节数据接收服务,服务具体实现代码。样例 立即下载

相关推荐

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 449

Netty系列(二):Netty拆包/沾包问题的解决方案

造成TCP协议粘包/拆包问题的原因是TCP协议数据传输是基于字节流的,它不包含消息、数据包等概念,是无界的,需要应用层协议自己设计消息的边界,即消息帧(Message Framing)。如果应用层协议没有使用基于长度或者基于分隔符(终结符)划分边界等方式进行处理,则会导致多个消息的粘包和拆包。

鳄鱼儿 1539

炸金花游戏(3)--基于EV(期望收益)的简单AI模型

前言:   炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章:  德州扑克AI--Programming Poker AI(译).  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运...

weixin_30377461的博客 2342

Netty入门(十)netty粘包拆包原理

目录TCP 粘包和拆包基本介绍TCP 粘包和拆包现象实例服务端客户端测试TCP 粘包和拆包解决方案一个具体的实例自定义协议编解码器服务端客户端测试练习自定义协议编解码器服务端修改客户端修改测试 TCP 粘包和拆包基本介绍 由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。 TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个数据包发给接收端,更有效的发给对方,使用了优化方法(Nagle算法)

weixin_42412601的博客 1093

Windows系统的Mamba环境配置详细教程(状态空间模型)

causal_conv1d也是安装mamba的依赖必须库。安装完成后,通过pip list可以查看到安装的库。Triton是安装mamba的依赖,需要先安装。上述工作准备好后,按下面步骤安装。直接根据离线文件安装即可。是自己的虚拟环境名字。

2301_77831163的博客 3677

Tushare Pro的安装使用——“抱歉,您没有访问该接口的权限,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108”问题

最近做毕设关于量化交易的, 因此一直使用tushare作数据源,但是过程中到一些问题,因此这里写篇文章,供大家一起交流下。 Tushare简介 Tushare是一个免费、开源的python财经数据接口包。拥有如股票、基金、期货等行情数据,公司财务、基金经理等基本面数据,以及债券、外汇、行业、大数据、区块链。Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,因此非常方便...

sinat_40875078的博客 1万+

Netty 教程 – Netty粘包/拆包解决之道

通过以上分析,我们清楚了粘包或拆包发生的原因,那么如何解决这个问题呢?数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。需要实现的逻辑主要对应于处理第一个数据包的时候,第一次调用。,用户自己去实现处理粘包、拆包的逻辑还是有一定难度的,的首部没有表示数据长度的字段,基于上面两点,在使用。,这里有不断的数据流入,而我们要做的就是从这个。的都知道,它是属于传输层的协议,传输层除了有。传输层之间的数据交互是大小不等的数据块,但是。内置的解决方案解决粘包/拆包的问题。

二师兄撒欢之地 1080

广州吉欧电子科技有限公司安卓开发工程师岗位 - 技术核心、职责详解与面试指南

广州吉欧电子科技有限公司招聘安卓开发工程师,该岗位可接收优秀应届生。岗位职责包括:1)负责安卓应用架构设计与开发,确保稳定性和可扩展性;2)功能模块编码实现与测试;3)性能优化与用户体验提升;4)后端接口对接;5)系统版本适配;6)用户反馈处理迭代;7)特殊要求熟悉RTK高精度定位技术原理及使用。该岗位要求扎实的安卓开发技术、良好的架构设计能力、性能优化经验,以及特定领域的RTK专业知识,是一个技术全面且具有专业特色的开发岗位。

郑伟强dev的专栏 154

Netty 使用教程

https://www.cnblogs.com/hellozjf/p/15704443.html 参考教程 尚硅谷Netty视频教程(B站超火,好评如潮) 002.Netty是什么 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目 Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。 Netty 主要针对在 TCP 协议下,面向 Clients 端的高并发应用,或者 Peer to Peer 场景

yygr的博客 3777

基于模型上下文协议(MCP)的可插拔式临床AI工具链Clinical DS研究(下)

本研究深入探讨了医疗AI在临床落地中的核心矛盾,即如何从“模型能答”迈向“系统可信、可用、可追溯”。为解决此矛盾,我们创新性地提出并详细设计实现了一套基于模型上下文协议(MCP)的**“可插拔式临床AI工具链”**架构。通过将复杂的医疗AI系统解构为Host、MCP Server和标准协议三层,并将各类能力(临床决策、影像分析、合规审计)封装为标准的、可独立演进的Server,我们成功地构建了一个模块化、高内聚、低耦合的系统。

AllenLV的博客 1380

手把手教你学simulink(90.1)--直流电动机实例:基于Simulink的基本模型的直流电动机(DC Motor)建模

直流电动机(DC Motor)因其结构简单、控制方便和良好的调速性能,广泛应用于各种工业自动化、机器人技术、家用电器以及航空航天等领域。为了更好地理解和应用直流电动机的工作原理及其控制系统,本项目旨在通过Simulink对直流电动机进行基本模型的建模与仿真。

MHD0815的博客 439

Java实现JT/T808以及T/GDRTA002-2020车辆协议对接

Java实现JTT808协议对接

qq_29648139的博客 3219

Xilinx FPGA平台GTX简易使用教程(汇总篇)

Xilinx平台GTX简易使用教程,先“知其然”,慢慢再研究“所以然”。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 3万+

JAVA通信系列三:Netty入门总结

一、Netty学习资料 书籍《Netty In Action中文版》 对于Netty的十一个疑问http://news.cnblogs.com/n/205413/ 深入浅出Nettyhttp://wenku.baidu.com/view/7765bc2db4daa58da0114a4c.html Netty了解与小试 http://www.cnblogs.com/xd502djj/arch...

weixin_33806509的博客 72

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Netty学习笔记(二)netty

文章目录Reactor 模型传统IO模型单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程Netty线程模型Echo实例Bootstrap单线程模型配置属性channelHandlerChannelHandlerContext入站出站顺序ChannelHandlerContext总结ChannelFuture多Handler例子异步模型Future 说明Future方法netty编码解码decoderEcoderTCP粘包什么是TCP粘包问题?如何处理粘包现象?UDP会不会产生

qq_46107726的博客 3010

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Netty 入门(002)启动流程之源码分析

一 看一段简洁高效的服务器启动代码 使用netty搭建socket服务器只需要通过无参的构造函数(因为netty需要设置的参数太多了,所以使用build模式来构建一个完整的对象),先看第一段代码 serverBootstrap = new ServerBootstrap(); 注意一点 搭建服务器使用 ServerBootstrap ,搭建客户端使用 Bootstrap ,点进去...

李伟发的博客 241

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

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

002 hello netty程序编写

1 Netty简介 Netty是由JBOSS提供的一个java开源框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序;也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用;Netty简化和流线化了网络应用的编程开...

诸般世界 198

JAVA通信系列三:Netty入门总结(转)

一、Netty学习资料 书籍《Netty In Action中文版》 对于Netty的十一个疑问http://news.cnblogs.com/n/205413/ 深入浅出Nettyhttp://wenku.baidu.com/view/7765bc2db4daa58da0114a4c.html Netty了解与小试http://www.cnblogs.com/xd502djj/arch...

weixin_34010949的博客 86

视频教程-通俗易懂的Netty从入门到源码剖析教程-Java

通俗易懂的Netty从入门到源码剖析教程 张长志技术全才、擅长领域:区块链、...

weixin_33810307的博客 316

002——Netty之Netty介绍

Netty出现背景 Java NIO难用 据说存在bug 业界其他NIO框架不成熟 Netty主要解决两个相应关注领域 (1)异步和事件驱动的实现。 (2)一组设计模式,将应用逻辑与网络层解耦。 特性 统一API,适用于不同协议 基于灵活、可扩展的事件驱动模型 高度可定制的线程模型 更好的吞吐量,低延迟 尽量减少不必要的内存拷贝 高性能 同步非阻塞,基于Reactor模型实现...

weixin_30502157的博客 90

Netty之Java I/O演进之路(一)

I/O基础入门 Java1.4之前的IO并不完善,只有同步阻塞的BIO,通常导致通信线程长时间阻塞,直到之后的NIO出现。 Linux 网络 I/O模型简介 Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个 file descriptor(fd,文件描述符)。而对一个 socket的读写也会有相应的描述符,称为 socketed( socket描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性) ----Net

FJJJJJ 1916

002-Netty核心技术及源码剖析-Netty是什么

文章目录1.netty介绍 1.netty介绍 基于事件驱动的网络应用框架:通过连接、断开、读、写数据,来触发事件,比如客户端向服务端发送连接请求,通过事件去处理,好比页面上点击按钮触发事件,最终调用方法 异步:相对于同步而言,比如客户端发送一个请求,需要等待服务端响应,才能干别的操作,异步的话(如:Ajax),不需要等待响应就可以干别的操作,还可以继续发送请求,只需要调用回调函数处理就可以 TCP/IP —》java原生的网络IO—》NIO—》Netty ...

zouxuhang的博客 213

TCP篇 002 大白话讲tcp的状态变迁

不管是TCP连接的建立还是双通道的关闭,亦或数据的传输等等 这些都是内核程序做的事,而应用程序更多的事感知Tcp的相关状态 以netty为例 包括 IdleState.READER_IDLE IdleState.WRITER_IDLE IdleState.ALL_IDLEsocket.close() ServerBootstrap启动等 有些状态需要底层进程处理,有些状态需要业务进...

小麒麟的博客 256
上一篇: Netty5入门学习笔记001
下一篇: Netty5入门学习笔记003-TCP粘包/拆包问题的解决之道(下)
樊鹏飞
博客等级 码龄15年 6粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值