无标题

# Netty

## 一、初步

+ 异步非阻塞

+ Future-Listener机制,方便用户主动获取或者通知机制获得IO操作结果

+ 底层数据传输封装完善

+ 功能依赖 1.7+

## 二、实现

### Server

+ 创建两个线程组,一个接收,一个网络读写

+ 创建辅助工具类 `ServerBootStrap`,用于服务器通道的配置

+ `NioServerSocketChannel` 设置NIO模式

+ `ChannelOption.SO_BACKLOG` 设置 TCP 缓冲区

+ `ChannelOption.SO_SNDBUF` 设置发送缓存

+ `ChannelOption.SO_RCVBUF` 设置接收缓存

+ `ChannelOption.SO_KEEPALIVE` 保持连接

+ `ChildHandler` 真正连接时的通道

+ 数据绑定, `b.bind(8765).sync()`

+ 等待关闭, `cf1.channel().closeFuture().sync()`

+ 线程组关闭 `Close`

------

### Client

+ 创建一个线程组

+ 创建辅助类

+ 数据绑定

+ 创建通道

+ `Handler` 真正连接的通道

+ 进行绑定

+ 等待关闭

------

### 数据传输

1. 客户端发送数据并刷新数据:  `cf1.channel().writeAndFlush(Unpooled.copiedBuffer(‘777‘.getBytes()));`

2. 数据处理完成以后及时清理:`ReferenceCountUtil.release(msg);`

3. 一般回写都用 `writeAndFlush` 要不然会很多内容一次发送,表现为一行

4. 在 Serverhandler 端中,增加一个监听器: `addListener(ChannelFutureListener.CLOSE);` 这会使在 Client 端通信完毕以后自动关闭,不会再存活。

5. 端口同时绑定多个端口,但是处理时使用同一个处理器,所以对于 Client 返回的数据是相同的

## 三、生产应用

### 部署

1. 生成一个maven项目,确保 jar 发布

2. 使用 Maven 打包,依赖 Maven-jar-plugin ,

3. Maven 打包,依赖插件配置在 `PluginManagement` 中

4. 在MANIFEST.MF 中有一个 Class-Main

![snipaste_20170808_220210](C:\Users\HoldDie\Desktop\snipaste_20170808_220210.png)

## 四、TCP 拆包、粘包

### 产生原因:

1. 应用程序 write 写入的字节大小大于套接口发送缓冲区的大小

2. 进行 MSS 大小的TCP分段

3. 以太网帧的 payload 大于 MTU 进行 IP 分片

当Client同时使用WriteAndFlush三次,Server端会当成一次请求。

### 解决方法:

1. 消息定长 `FixedLengthFrameDecoder` 定长

1. sc.pipeline().addLast(new FixedLengthFrameDecoder(5));

2. sc.pipeline().addLast(new StringDecoder());

3. sc.pipeline().addLast(new ServerHandler());

2. 在包的尾部加特殊字符进行分割 ``

1. ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());

2. sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,buf));

3. sc.pipeline().addLast(new StringDecoder());

4. sc.pipeline().addLast(new ServerHandler());

3. 消息分为消息头,消息体,

## 五、补充

### Java 序列化存在问题:

1. Java 序列化机制是 Java 内部的一种对象编解码技术,无法跨语言使用:对于异构系统之间的对接,Java 序列化后的码流需要能够通过其他语言反序列化成原始对象(副本),目前很难支持

2. 相比于其它开源的序列化框架,Java 序列化后的码流太大,无论是网络传输还是持久化到磁盘,都会导致额外的资源占用。

3. 序列化性能差(CPU资源占用高)

### 高性能(RPC)三个要素:

1. 传输:BIO、NIO、AIO,IO模型在很大程度上决定了框架的性能

2. 协议:采用什么样的通信协议,HTTP或者内部私有协议。

3. 线程:都区之后的编解码在哪个线程进行,编解码后的消息如何转发,Reactor线程模型的不同,对性能的影响也非常大。

时间: 2024-10-15 09:49:40

无标题的相关文章

全屏无标题设置

Android开发中,经常遇到需求设置应用的Activity全屏,并且不显示标题栏.这里记录几个方法: 方法一:在java代码中实现, //取消标题 this.requestWindowFeature(Window.FEATURE_NO_TITLE); //全屏 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 但是这

为活动统一设置无标题&&全屏

因为我们在做一些活动界面的时候,一般使用无标题的时候都会使用到全屏来显示一些活动内容,因此我们来利用创建style来实现: <?xml version="1.0" encoding="utf-8"?> <resources> <style name="theme_full_screen" parent="android:Theme.Black"> <item name="an

C#无标题窗体的拖动

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; namespace Example013_无标题窗体的拖动 { /// <summary> /// Form1 的摘要说明. /// </s

无标题窗体拖动(三种方法)

通过响应“wm_NCHitTest”消息来移动窗体.Windows发送“wM_NCHitTest”消息来确定鼠标操作是否发生在窗体的客户区,或边框的特殊区上(非客户区).如果Windows发现用户单击了窗体标题,系统将移动窗体,单击了窗体边框,则系统将开始改变窗体大小.例程如下: //声明一自定义事件,拦截“WM_NCHITTEST”消息 Procedure MoveForm(var M:TWMNCHITTEST);Message WM_NCHITTEST; Procedure TForm1.M

Android TV 全屏无标题

想要全部窗口全屏无标题,修改 res\values\styles.xml 可设置主题和样式 <resources> <!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices. --> <style name="AppBaseTheme"

Android:实现无标题的两种方法

实现无标题的两种方法:配置xml文件和编写代码设置 1.在AndroidManifest.xml文件中进行配置 实现全屏效果: android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 实现无标题栏(但有系统自带的任务栏): android:theme="@android:style/Theme.NoTitleBar" 2.编写代码设置 requestWindowFeature(Window.FEATURE

MFC修改窗口无标题和标题信息,修改执执行文件图标

一.创建MFC后 窗口显示的是 无标题-工程名 修改方法在网上看到了几种,下面介绍下比较简单的一种: 1.在MianFrame.c文件中找到这个函数 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 2.在函数中添加这样一句可以 修改标题名称 m_strTitle = "我的标题v1.0"; 3.在函数中添加如下代码可以去除无标题几个字 cs.style &= ~FWS_ADDTOTITLE ;//防止MFC在窗口标题

拖动无标题窗口的方法

有的时候,我们需要自绘窗口的标题,或者隐藏了窗口标题,那么问题来了,这就是怎么拖动无标题的窗口? 这个问题的本质便是怎么在窗口的客户区上,拖动鼠标,并且移动窗口. 通常状态下,一个窗口只有在标题栏的区域,才会响应鼠标拖动的消息.而在窗口的客户区并不会响应. 这样便有了一个方法,就是我们可以欺骗windows,让它误认为鼠标点击窗口客户区时是点击在了标题栏上. 有这么个消息,就是WM_NCHITTEST. MSDN对它的解释是: The WM_NCHITTEST message is sent t

无标题窗体的移动及其简单美化

      先看效果图吧. 最近做Web,发现网页三剑客总是会留下一些“最近打开项目”这样的痕迹在软件的界面上,心里总是觉得很不舒服,于是萌发了写一个清除器的念头.说动手就动手吧! DW.FW.Fl 的这些痕迹都是存在于注册表中的,简单原理就是删除注册表里的值就ok了,这些应该没有什么好说的,所以我就不说了.今天我们主要来讲一下无标题栏的窗体拖动问题和使用图片来简单的美化界面的问题. 可能有很多人都认为无标题栏窗体的移动是非常简单的,网上很多的朋友也给出了一些方法,大多说人给出的方法是在窗体的p

Android 无标题 全屏设置

标题栏和状态栏 Android程序默认情况下是包含状态栏和标题栏的. 在Eclipse中新建一个Android程序,运行后显示如下: 图中标出了状态栏(显示时间.电池电量.网络等)和标题栏(显示应用的名称,即activity的android:label的属性值). 要隐藏标题栏和状态栏,总体来说有两种方法,一种是在代码中设置,另一种是在manifest文件中设置. 下面先介绍在代码中设置的方法. 在Java代码中设置 隐藏标题栏: public class MainActivity extend