zoukankan      html  css  js  c++  java
  • Socket网络通信编程(二)

    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,进行初始化的准备工作,比如设置接受传出数据的字符集、格式以及实际处理数据的接口。

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

  • 相关阅读:
    HTTP——学习笔记(3)
    HTTP——状态码
    HTTP——学习笔记(2)
    HTTP——学习笔记(1)
    Sqlserver 存储过程
    Sqlserver 函数(例子)
    Sqlserver 函数
    sqlserver字段类型
    redis入门笔记(2)
    redis入门笔记(1)
  • 原文地址:https://www.cnblogs.com/alter888/p/9274144.html
Copyright © 2011-2022 走看看