1.Netty初步

2.HelloWorld

3.Netty核心技术之(TCP拆包和粘包问题)

4.Netty核心技术之(编解码技术)

5.Netty的UDP实现

6.Netty的WebSocket实现

7.Netty实现文件服务器(基于HTTP协议)

8.最佳实践(数据通信、心跳检测)

9.mina入门基础

1.1为什么选择Netty

我们已经了解了Socket通信/IO/NIO/AIO编程,对于通信模型已经有了一个初步的认识,其实仅仅是一个模型,如果想把这些真正的用于实际工作中去,那么嗨需要不断地完善、扩展和优化。比如很经典的TCP读包写包问题,或者是数据接收的大小,实际的通信读取与应答的处理逻辑等等一些细节问题需要我们认真的 去思考,而这些我们都需要大量的时间和经历,以及丰富的经验。所以想学会socket通信不是件容易的事情,那么现在,我们就要学习一门新的技术Netty,我们为什么选择Netty,原因无他,简单!不必去编写复杂的代码逻辑去实现通信,不需要考虑性能问题,不需要考虑编解码的问题,半包读写问题等,这些强大的Netty已经帮我们实现好了,我们 只需要使用即可。

Netty是最流行的NIO框架,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro以及JMS框架RocketMQ,还有主流的分布式通信框架Dubbox等等。

Netty简介

Netty是基于Java NIO的网络应用框架

Netty是一个NIO client-server(客户端服务器)框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来使开发网络应用程序,这种新的方式使得它很容易使用和有很强的扩展性。Netty的内部实现时很复杂的,但是Netty提供了简单易用的api从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,所以整个Netty都是异步的。

网络应用程序通常需要有较高的可扩展性,无论是Netty还是其他的基于Java NIO的框架,都会提供可扩展性的解决方案。Netty中一个关键组成部分是它的异步特性,本章将讨论同步(阻塞)和异步(非阻塞)的IO来说明为什么使用异步代码来解决扩展性问题以及如何使用异步。

 Netty的功能非常丰富

通过本书可以学习Netty丰富的功能。下图是Netty框架的组成

Netty特性

Development Area

Netty Features

Design(设计)

  • 各种传输类型,阻塞和非阻塞套接字统一的API
  • 使用灵活
  • 简单但功能强大的线程模型
  • 无连接的DatagramSocket支持
  • 链逻辑,易于重用

Ease of Use(易于使用)

  • 提供大量的文档和例子
  • 除了依赖jdk1.6+,没有额外的依赖关系。某些功能依赖jdk1.7+,其他特性可能有相关依赖,但都是可选的。

Performance(性能)

  • 比Java APIS更好的吞吐量和更低的延迟
  • 因为线程池和重用所有消耗较少的资源
  • 尽量减少不必要的内存拷贝

Robustness(鲁棒性)

鲁棒性,可以理解为健壮性

  • 链接快或慢或超载不会导致更多的OutOfMemoryError
  • 在高速的网络程序中不会有不公平的read/write

Security(安全性)

  • 完整的SSL/TLS和StartTLS支持
  • 可以在如Applet或OSGI这些受限制的环境中运行

Community(社区)

  • 版本发布频繁
  • 社区活跃

Helloworld入门

在学习Netty之前,先来回顾一下NIO的通信步骤:

①创建ServerSocketChannel,为其配置非阻塞模式。

②绑定监听,配置TCP参数,录入backlog大小等。

③创建一个独立的IO线程,用于轮询多路复用器Selector。

④创建Selector,将之前创建的ServerSocketChannel注册到Selector上,并设置监听标识位SelectionKey.OP_ACCEPT。

⑤启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道。

⑥当轮询到处于就绪状态的通道时,需要进行操作位判断,如果是ACCEPT状态,说明是新的客户端接入,则调用accept方法接收新的客户端。

⑦设置新接入客户端的一些参数,如非阻塞,并将其继续注册到Selector上,设置监听标识位等。

⑧如果轮询的通道标识位是READ,则进行读取,构造Buffer对象等。

⑨更细节的问题还有数据没发送完成继续发送的问题......

好啦,开始学习Netty了。先去http://netty.io/上下载所有的Netty包。

Netty通信的步骤:

①创建两个NIO线程组,一个专门用于网络事件处理(接受客户端的连接),另一个则进行网络通信的读写。

②创建一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传出数据的缓存大小等。

③创建一个用于实际处理数据的类ChannelInitializer,进行初始化的准备工作,比如设置接受传出数据的字符集、格式以及实际处理数据的接口。

④绑定端口,执行同步阻塞方法等待服务器端启动即可。

Socket网络通信编程(二)的更多相关文章

  1. 经过一年时间的沉淀 再次回首 TCP Socket服务器编程 (二)

    ------------------ 前言 ------------------ 发了第一篇文章后,有不少同志留言,看来socket编程仍然是软件系统里面一个比较难的部分. 第一篇文章主要介绍了传输协 ...

  2. Socket网络通信编程(一)

    1.学习基本概念.传统的同步阻塞式I/O编程.伪异步IO实现 2.学习基于NIO的同步非阻塞式编程 3.了解基于NIO2.0的异步非阻塞(AIO)编程 1.1 基本概念 Socket又称“套接字”,应 ...

  3. Socket网络编程二

    SocketServer socketserver一共有这么几种类型 class socketserver.TCPServer(server_address, RequestHandlerClass, ...

  4. Java Socket聊天室编程(二)之利用socket实现单聊聊天室

    这篇文章主要介绍了Java Socket聊天室编程(二)之利用socket实现单聊聊天室的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在上篇文章Java Socket聊天室编程(一)之 ...

  5. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  6. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  7. 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题

    1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...

  8. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...

  9. windows socket 网络编程

    样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...

随机推荐

  1. 针对WordPress站点思路

    一.使用WPscan 1).简介 WPScan是一个扫描 WordPress 漏洞的黑盒子扫描器,它可以为所有 Web 开发人员扫描 WordPress 漏洞并在他们开发前找到并解决问题.我们还使用了 ...

  2. 创建React脚手架

    node版本10.14.2 下载地址 如果是其版本的话会出错 css-loader 会不兼容 主要是8.x的版本不兼容 npm install -g create-react-app 全局安装 cre ...

  3. mysql5.7 修改用户密码

    修改vi /etc/my.cnf,增加skip-grant-tables可以免密码登录mysql use mysql ; update user set authentication_string=P ...

  4. Spring框架 课程笔记

    Spring框架 课程笔记 第1章  Spring概述 1.1 Spring概述 1)        Spring是一个开源框架 2)        Spring为简化企业级开发而生,使用Spring ...

  5. P1141零一迷宫

    这是一道对于除了我之外其他人都十分简单的搜索题,我终于在这个夜里搞会了. 首先其问可以到达多少个点,并不是走一次可以最多经过几个点,这就解释了为什么不需要回溯,并且递归边界则是让其全部走完即可.于是便 ...

  6. C++ 统计输入的句子有多少英文字母

    // ConsoleApplication1.cpp: 定义控制台应用程序的入口点.//#include "stdafx.h"#include <iostream>#i ...

  7. centos7 安装redis 出现cc: command not found错误解决

    安装过程 1. 下载并解压 cd /root/software wget http://download.redis.io/releases/redis-3.2.4.tar.gz tar -zxvf ...

  8. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  9. ThinkPHP视图css和js加上版本号防止缓存

    前台模块中,我的所有控制器都继承BaseController,虽然ThinkPHP中我们提供了两个配置项 'TMPL_CACHE_ON' => false,// 禁止模板编译缓存 'HTML_C ...

  10. vue生命周期简单总结

    生命周期(钩子函数):一个组件从创建到销毁的过程就是生命周期     beforeCreate: 创建前     1.当前vue实例化的时候会做一个初始化的操作,在这个生命周期函数中我们可以做初始化的 ...