Socket netty ...

1.什么是Socket?

Socket就是为网络服务提供的一种机制。

通讯的两端都有Sokcet

网络通讯其实就是Sokcet间的通讯

数据在两个Sokcet间通过IO传输。

2.TCP与UDP在概念上的区别

udp: a、是面向无连接, 将数据及源的封装成数据包中,不需要建立建立连接

b、每个数据报的大小在限制64k内

c、因无连接,是不可靠协议

d、不需要建立连接,速度快

tcp:a、建议连接,形成传输数据的通道.

b、在连接中进行大数据量传输,以字节流方式

c 通过三次握手完成连接,是可靠协议

d 必须建立连接m效率会稍低

TCP三次握手

①客户端发送SYN报文,并设置发送序号为X 给服务端 这是第一次握手

②服务器端接受到SYN报文 并发送SYN+ACK报文,并设置发送序号为Y 给客户端 这是第二次握手

③客户端第三次握手 告诉服务端 准备给服务端发数据 建立起连接 开始传输数据

为什么不是两次或者四次:

三次是保证双方互相明确对方能收能够接收与发送。三次已经足够了.

TCP四次挥手

①客户端像服务端发起请求,表示没有数据要发送了

②服务端像客户端发起请求,确认客户端的断开请求请求

③客户端像服务端发送信号,请求断开连接

④服务端接收客户端请求,发送确认断开连接信号,同意断开 b收到 断开

为什么2、3次挥手不能合在一次挥手中

因为客户端不发生数据了,但是还可以接收数据,服务端可能还有数据发送给客户端,所以两次不能合并.

3.什么是NIO?

Java NIO(New IO)是一个可以替代标准Java IO API的IO

API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。

Java NIO: Channels and Buffers(通道和缓冲区)

标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

Java NIO: Non-blocking IO(非阻塞IO)

Java NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。

Java NIO: Selectors(选择器)

Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

注意:传统IT是单向。 NIO类似

4.Buffer的数据存取

一个用于特定基本数据类行的容器。有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类。

Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道读入到缓冲区,从缓冲区写入通道中的。

Buffer就像一个数组,可以保存多个相同类型的数据。

5.Buffer的概述

1)容量(capacity):表示Buffer最大数据容量,缓冲区容量不能为负,并且建立后不能修改。

2)限制(limit):第一个不应该读取或者写入的数据的索引,即位于limit后的数据不可以读写。缓冲区的限制不能为负,并且不能大于其容量(capacity)。

3)位置(position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制(limit)。

4)标记(mark)与重置(reset):标记是一个索引,通过Buffer中的mark()方法指定Buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position。

6.直接缓冲区与非直接缓冲区别

非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中

直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率

7.分散读取与聚集写入

分散读取(scattering Reads):将通道中的数据分散到多个缓冲区中

聚集写入(gathering Writes):将多个缓冲区的数据聚集到通道中

8.BIO与NIO

IO(BIO)和NIO区别:其本质就是阻塞和非阻塞的区别

阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,就会一直等待,直到传输完毕为止。

非阻塞概念:应用程序直接可以获取已经准备就绪好的数据,无需等待。

IO为同步阻塞形式,NIO为同步非阻塞形式,NIO并没有实现异步,在JDK1.7后升级NIO库包,支持异步非阻塞同学模型NIO2.0(AIO)

BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一个方法上,直到数据准备就绪:或者采用轮训的策略实时检查数据的就绪状态,如果就绪则获取数据.异步时,则所有的IO读写操作交给操作系统,与我们的应用程序没有直接关系,我们程序不需要关系IO读写,当操作系统完成了IO读写操作时,会给我们应用程序发送通知,我们的应用程序直接拿走数据极即可。

9.什么是Netty

Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。

10.Netty应用场景

1.分布式开源框架中dubbo、Zookeeper,RocketMQ底层rpc通讯使用就是netty。

2.游戏开发中,底层使用netty通讯。

11.TCP粘包、拆包问题解决方案

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

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

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

12.为什么需要 WebSocket?

因为 HTTP 协议有一个缺陷:通信只能由客户端发起。WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其他特点包括:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

原文地址:https://www.cnblogs.com/zeenzhou/p/10711842.html

时间: 2024-07-31 18:56:50

Socket netty ...的相关文章

一次netty与java socket的压力测试对比【yetdone】

1 结果:比较遗憾,无论是本机.单核远程.4核远程,两边的测试效果相当 2 远程测试,netty与socket都只能到900个连接,极限了,4核服务器也是 3 本地测试 2000个连接: 参数要点: Forever,否则太多线程提早退出,弱化bio的弱点 响应超时太短,则两边都是同样的错误率.同样的吞吐量 socket netty qps socket高 平均响应时间 socket高 想要时间稳定性 netty好 原文地址:https://www.cnblogs.com/silyvin/p/12

Netty in Action (七) 第三章节 Netty组件和设计

这个章节包括: 1)Netty的架构设计和技术点 2)Channel,EventLoop和ChannelFuture 3)ChannelHandler 和 ChannelPipeline 4)Bootstrap 在第一章节中,我们讲述了java在高性能的网络编程的发展历史和对网络方面的技术基础的积累,这给对Netty的核心组件和构建模块分析提供了一个很好的氛围 在第二章节中,我们扩大了我们的讨论范围,我们构建了我们第一个基于Netty的应用,通过构建简单的服务器端和客户端让我们了解了如何启动Ne

.net基础学java系列(七)赶鸭子上架看项目代码

项目用到的技术栈 序列化 com.alibaba.fastjson.JSON; https://github.com/alibaba/fastjson/wiki/Quick-Start-CN 日志 log4j2 http://logging.apache.org/log4j/2.x/ 缓存 redis: spring.redis spring.redis.jedis 数据库访问 Druid 数据库连接池 https://github.com/alibaba/druid/wiki mybatis-

java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C# 和 java的通信.以及完整的实例代码 java 代码 svn 地址,本人开发工具是NetBeans 8.0.2 使用 maven 项目编译 http://code.taobao.org/svn/flynetwork_csharp/trunk/BlogTest c# 代码 svn 地址 使用的是

Netty的socket编程(四)

Netty提供的handler:编解码,消息头,消息编码 1. 连接建立后,客户端和服务端都不会主动发消息,实现handler的channelActive来触发消息发送. 2.SimpleChannelInboundHandler的重载方法 (1)handlerAdded  连接建立时调用 (2)HandlerRemoved 连接断开时调用 (3)HandlerActive 连接处于活动状态调用 (4)HandlerInactive 连接处于不活动状态调用 socket示例 : server启动

netty socket 客服端编程

1 package com.ming.netty.nio; 2 3 import io.netty.bootstrap.Bootstrap; 4 import io.netty.channel.ChannelFuture; 5 import io.netty.channel.ChannelInitializer; 6 import io.netty.channel.ChannelOption; 7 import io.netty.channel.EventLoopGroup; 8 import

atitit.软件开发--socket框架选型--netty vs mina j

atitit.软件开发--socket框架选型--netty vs mina j . Netty是由JBOSS提供的一个java开源框架 Apache mina 三.文档比较 mina文档多,,, 好几倍... 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:[email protected] 转载请注明来源: http://blog.csdn.net/attilax 四.UDP协议传输 1. netty将UDP无连接的特性暴露出来:而mina对UDP进行了高级层次的抽象,可以把UD

基于netty框架的Socket传输

一.Netty框架介绍 什么是netty?先看下百度百科的解释: Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用.Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发. "快速&qu

netty同时实现http与socket

(1)启动类 package test; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; /** * netty服务器启动类 * @author songyan * */