自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

转载 性能优化总结

一、启动优化 1、启动优化介绍 app启动超过8s留存率就会流失70%。 启动分为冷启动(Application及Activity生命周期都重启)、热启动(从后台变到前台)、温启动(不走Application生命周期,只是重新启动Activity的生命周期) 需要优化的是Applicati...

2020-04-14 16:32:39 73 0

转载 socket收获

一、 二、 三、 四、 五、 六、 七、 八、

2020-04-02 22:08:55 52 0

转载 Socket导学

一、为什么Socket难 数据粘包、数据丢包、心跳维持、性能问题 二、目的 一套推送框架、IM传输原理、胜任物联网开发职位、协议制定者、理解其他相关库的底层原理 三、目标与收获 ByteBuffer Channel 桥接技术 内存复用 NIO ...

2020-04-02 21:50:42 62 0

转载 简单内存复用与细节优化

一、内存优化细节 如图可以看出有内存抖动,解决办法是内存缓存。 使用内存缓存的时候需要注意的点就是当一个实例不再使用的时候,也应该去释放这个实例,不能让这个实例越积累越多,从而导致内存溢出。所以内存溢出的概念就是,当一个实例被创建之后,后续过程中不可能用到这个实例的时候,但是我们把这份实例...

2020-04-02 21:48:33 118 0

转载 多线程调度瓶颈分析

一、多线程调度瓶颈分析 之前加强版的调度流程,在之前的调度流程当中,有一个专属的Accepter的线程,用来做我们的连接。当有新的连接的时候,将它们添加到连接队列。在连接队列中可以分别进行输入、输出的selector的线程,这个线程命名为Processor。当数据就绪的时候,会把scoket...

2020-04-01 06:41:17 84 0

转载 语音即时通信总结

一、 要回答这个问题,从最基本的数据传输开始说。将数据从一个麦克风开始传输到另一个客户端上,并且进行播放来说,它的流程是怎样的呢? 对于客户端A来说,它首先会将数据投递到一个SendPacket当中,也就是直流传输,然后会把数据解析成每一个帧,然后将每一个帧的数据解析成IoArgs,最...

2020-03-30 22:55:29 44 0

转载 客户端数据编码技术选型

一、语音传输流程 要把麦克风录制的声音发送到另一个客户端或者是本机的麦克风上播放,第一步就是录制最原始的声音,最原始的声音就是PCM数据流。这个数据流不能直接进行传输,需要先进行压缩转码操作。而压缩转码和我们的数据流之间其实是一个循环操作,它可以不断去拿原始数据,然后去压缩转码。将数据压缩转...

2020-03-30 14:13:17 31 0

转载 服务器桥接改造实现

一、环形缓冲区 环形缓冲区就是一个环形的东西,里面的数据头、尾结合在一起,形成了环形缓冲区。环形缓冲区有一个特点,当一个数据元素被删掉之后,其余的元素不需要移动它的位置。同时,它满足先进、先出的规则,缓冲区比较适合最开始确定的一个最大容量的情况下,那么,往里面填充数据,最终读取数据的过程。 ...

2020-03-30 12:09:04 53 0

转载 语音数据直流扩展

一、数据传输流程 如果想发送数据,先把数据放到Packet中,然后把数据写入到IoArgs中再进行发送。在这个过程中,packet对应的是一个有限大小的inputstream,会把数据读取一部分到buffer中,这个过程是由channel来完成的,也就是从packet到buffer之间的ch...

2020-03-30 07:23:14 35 0

转载 语音即时通信分析

一、 二、 输入端可以是屏幕也可以是摄像头,通过软件将音频、视频转换为数据,然后该数据流通过管道传输到服务器上面。如果软件具备一定的服务器功能,也可以直接发送到CDN上面。如果传输到服务器的大后台,还可以在该大后台上增加一些广告,用户会看一部分视频,看一部分广告,再看一部分视频,这些是...

2020-03-29 16:29:41 77 0

转载 心跳包构建与消费调度

一、Netty心跳实现 二、重要类 HeartbeatReceiveFrame : 心跳接收帧 HearbeatSendFrame : 心跳发送帧 ScheduleJob : 心跳包调度(一个runnable) IdleTimeoutScheduleJob : 空闲超时的心跳包调度(...

2020-03-29 13:30:56 35 0

转载 心跳包必要性与策略选择

一、CS模型中如何相互知晓状态 为什么需要心跳包? 在传统的CS模型中,客户端与服务端相互发送消息的过程中,是需要知道相互之间的状态的,因为客户端随时可能给服务端发送消息。在聊天过程中,是不可能客户端随时给服务端发送消息,真实情况是服务端收到某个客户端的消息之后推送过来。在这个过程中,服务器需...

2020-03-29 06:03:52 59 0

转载 服务器消息调度逻辑规范化

当消息到达服务端的时候,是给所有客户端发送消息,没有一个群的概念。 应该有一个新建群,然后加入群聊。加入群聊后,发送消息将会通知到群聊中的所有客户端。 也可以退出群聊,退出群聊后发送的消息将不会被客户端收到。 二、类说明 ConnectorHandlerChain : 连接Handler的...

2020-03-29 03:07:28 29 0

转载 数据三层缓冲区IoArgs调度优化

一、三层缓冲区 Packet IoArgs Frame 二、三者的管理者 Packet是AsyncSendDispatcher或者AsyncReceiveDispatcher Frame是AsyncPacketReader或者AsyncPacketWriter IoArgs比较模...

2020-03-27 13:22:07 54 0

转载 并发客户端BUG修复与性能优化二

一、bufferedReader读取数据 如果强制退出,读取数据时可能为空,使用str时可能报空指针异常 str = bufferedReader.readLine() 所以需要添加判断 if(str == null||Foo.COMMAND_EXIT.equalsIgnoreCa...

2020-03-27 11:17:16 27 0

转载 并发客户端BUG修复与性能优化一

一、 当线程处于Monitor状态时,说明等待实体的释放。即多个线程在等待同一个锁的释放。 1、对于写线程 当Selector处于工作状态时,是不允许更改其集合体的,即此时不能调用 key.interestOps(key.readyOps()) channel.register(se...

2020-03-27 00:54:50 37 0

转载 消息调度分析

一、客户端与服务器之间最多建立多少个Socket链接? 自己的电脑连接达到成千上万个的时候就会发生崩溃。 Socket四要素:服务器的地址、服务器的端口、客户端的地址、客户端的端口 49152到65535号端口属于“动态端口”范围,没有端口可以被正式地注册占用。 65535-49152 = ...

2020-03-26 23:07:15 30 0

转载 消息分片设计与实现-发送、接收调度

一、 二、

2020-03-26 14:46:42 51 0

转载 消息分片传输设计与实现

一、数据发送过程中存在的问题 发送中无法取消文件发送 大文件传输容错率较低 同一连接无法实现文件、普通消息优先级 二、分片数据传输流程 三、分片逻辑实现 根据文件大小计算分片、并读取数据到分片 分片数据固定格式打包发送 分片数据解析与分片组装 Dispatcher调度逻辑...

2020-03-25 06:04:39 83 0

转载 文件消息模型基础实现

一、文件传输与普通传输区别 最大的区别:文件数据bytes远远大于普通数据bytes 文件传输需分片、组装分片 文件传输如何中途取消而不影响后续的Packet发送 文件传输校验、保证数据准确性(逻辑上) 二、普通数据传输 ...

2020-02-25 11:32:58 67 0

转载 混传数据总结与梳理

一、Connector类 Connector中的SocketChannel是Sender和Receiver的实现类,因此Selector具有接收和发送的功能。 发送时,将SocketChannel封装成一个StringSendPacket,接收时将StringReceivePacket解析为S...

2020-02-16 10:56:04 40 0

转载 数据传输稳定性

一、消息粘包 1、TCP TCP本质上并不会发生数据层面的粘包 TCP的发送方与接收方一定会确保数据是以一种有序的方式到达客户端 并且会确保数据包完整 TCP数据传输具有:顺序性、完整性 2、UDP UDP不保证消息完整性,所以UDP往往发生丢包等情况 在常规所说的Socket“粘...

2020-02-16 05:21:53 142 0

转载 借鉴学习HTTP精髓

一、HTTP 1.X 1.1 请求头、body的长度 HTTP 1.x前面24个字节是描述符,24 bytes是总的长度,头部的长度是16 bytes(可以解析为时间、packet长度和capture长度),然后可以得到body的长度(24bytes-16bytes) 1.2 下面...

2020-02-14 02:55:51 66 0

转载 NIO服务器Thread优化

IoProvider:为所有channel提供注册与取消注册 想要从SocketChannel中读取数据,但是需要使用异步的方式,需要通过观察者模式,采取注册与取消注册的方式。 当SocketChanne中的数据可读或者可取时,通过Callback进行回调处理 ...

2020-02-13 08:08:15 84 0

转载 NIO重写服务器

一、Channel与Buffer Channel可以写到不同的Buffer 同理,channel也可以从不同的Buffer中读取数据 二、NIO重写服务器 监听客户端到达 接收、回送客户端 转发客户端数据到另外一个客户端 多端消息的处理 三、 3.1 图示 ...

2020-01-15 15:38:54 58 0

转载 NIO常用的API

一、Selector注册事件 1.1 SelectionKey.OP_CONNECT 连接就绪(客户端连接好了,需要经过三次握手、四次挥手) 1.2 SelectionKey.OP_ACCEPT 接受就绪(有新客户端来了) 1.3 SelectionKey.OP_READ ...

2020-01-15 10:42:39 30 0

转载 NIO family 一览

一、Buffer缓冲区 用户数据处理的基础单元,客户端发送与接收数据都需要通过Buffer转发进行 二、Channel通道 类似于流;但不同于IN/OUT Stream;流具有独占性与单向性;通道则偏向于数据的流通多样性 三、Selectors选择器 处理客户端所有事件的分发器 ...

2020-01-15 06:33:13 37 0

转载 阻塞IO和非阻塞IO

一、阻塞IO 因为阻塞IO的存在,导致只能使用一个线程进行等待,等待的线程也会引起额外的资源消耗,引起CPU调度问题。如果数量达到百万级,需要发送的数量非常多,此时,大量的时间被用在了线程切换上,我们需要做的是尽量减少CPU处理线程消耗的时间,用来处理真正需要处理的数据。 当有客户端到达的...

2020-01-15 06:14:39 39 0

转载 服务器性能优化

一、性能监测工具 1、jconsole jdk的bin目录,jconsole可以查看当前进程所消耗的资源 2、jvisualvm jvisualvm不仅可以调试本地,还可以调试远程 2.1 同时运行客户端和服务器 2.2 查看server进程的监视器 双击server.j...

2020-01-15 05:43:09 56 0

转载 服务器状态

一、服务器状态--繁忙 每个客户端都需要服务器进行双通等待 双通:客户端发送数据到服务器的接收通道 双通:服务器回送消息的发送通道 每条通道因为堵塞只能使用异步线程实现 二、服务器线程数量 一个客户端:双通->2条线程 n个客户端:2n条线程 服务器实际线程数量:2n+(...

2020-01-15 02:34:45 41 0

转载 客户端如何发送消息到客户端

一、每个客户端都是服务器也是客户端吗? 不是。如果是这样的话,必须将设备同时设为服务器和客户端,但是这样,也只能实现两台设备之间消息的传输。如果要实现多客户端的话,会非常复杂。 二、2个以上的设备如何交互数据? 需要约定一个规则作为一条信息完整传输的标志。 流程是客户端-->服务...

2020-01-15 01:49:30 27 0

转载 简易聊天室案例

一、聊天室数据传输设计 这是一个由多人组成的聊天案例,所以称为聊天室。 它的基本要素就是多个客户端、服务器。 必要条件:客户端、服务器 必要约束:数据传输协议(本案例中,每一行都是一条数据) 原理:服务器监听消息来源、客户端连接服务器并发送消息到服务器 二、客户端、服务器数据交互 ...

2020-01-14 20:16:23 42 0

转载 数据发送与接收并行

服务端接收的socket可能有很多,会将这些客户端保存到一个集合中,当有输入的时候,遍历这些客户端进行发送。 当接收的时候,会只解析指定客户端的信息。 客户端: package client; import client.bean.ServerInfo; import java.i...

2020-01-14 19:20:12 108 0

转载 服务端向客户端发送数据,但是客户端接收不到

问题: 通过Socket,服务端向客户端发送数据时,客户端一直接收不到 服务端发送代码: ClientWriteHandler.this.printStream.print(msg); 原因: 在socket代码中使用print方法时,要想将数据发送出去,必须在发送的数据后面添加”...

2020-01-14 18:47:05 329 0

转载 点对点传输实现

服务端: package server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; impo...

2020-01-14 09:33:08 105 0

转载 UDP搜索IP与端口

一、UDP优势 UDP可以作为广播发送 可以用于搜索 更专注于传输速度 基于报文进行传输 二、TCP优势 基于连接的传输 相对于UDP传输更加精确 更能保证数据传输的稳定性与健壮性,如果不发生异常,一定能确定数据完整地送达 三、TCP、UDP使用场景 3.1 知道服务器...

2020-01-14 08:32:48 175 0

转载 TCP基础数据传输

一、基础类型数据传输 byte、char、short boolean、int、long float、double、string byte(8位)是最基础的数据类型,是网络传输中最基本的数据类型。 byte可以转换为char。 short(16位)可以转换位2个byte数组。 bool...

2020-01-13 11:52:06 18 0

转载 TCP传输可靠性-排序、丢弃、重发

一、排序、顺序发送、顺序组装 当进行一条数据发送的时候,首先,TCP会将这条数据拆分成不同的片段,然后把片段进行一个排序。然后把排序号的片段顺序进行发送。 这样,保证了传输的有序性。 二、丢弃、超时 在整个发送过程中,如果时间片没有到达,或者时间片超时,客户端是可以收到数据被丢弃或者超...

2020-01-13 01:29:32 48 0

转载 TCP连接可靠性--三次握手、四次挥手

一、三次握手 1.1 发送端是客户端,接收端是服务器端 第一步是由客户端发起的,服务端其实是处于被动连接状态,此时它处于等待状态。 Sender会发送一个SYN命令(连接请求命令),该命令会携带一个随机值x参数,发送到服务端。 Receiver收到后会校验SYN命令,如果该命令是完整...

2020-01-13 00:57:29 44 0

转载 TCP核心API

一、Socket 1.1 Socket() 创建一个Socket 主要用于创建客户端的连接,客户端创建的时候会创建一个无连接、无绑定的空状态Socket 1.2 bind() 绑定一个Socket到一个本地地址和端口上 1.3 connect() 连接到远程套接字 1....

2020-01-13 00:22:15 71 0

提示
确定要删除当前文章?
取消 删除