网络编程

URL参数

http://www.baidu.com:80/search?q=test&safe=strict
协议----域名/IP地址—端口–路径--------参数

域名解析

对于域名:www.baidu.com,它末尾省略了一个root,其实是 www.baidu.com.root
在对域名解析时,其实是从右往左进行解析的。

域名层级(类似于索引,可以更有效的进行查找)

根域名——.root
顶级域名——.com 、 .edu 、 .org
次级域名——.baidu 、.google
主机名——www

聊天室设计的选型

  • BIO:连接数少,开发难度低。客户都是内部的,比如公司内的某个小组。
  • NIO:连接数多,单一线程在轮流处理不同连接通道上的数据。它可能的问题是如果某一个连接它需要处理的时间非常的漫长,就会导致其他连接上的请求没有被及时的处理。
  • AIO:连接数多。很多图片下载这种需要较长时间处理的任务,可以选择AIO。

BIO聊天室(需要多个线程,每个客户分别用一个线程来进行处理)

  • 客户端和服务端。用户输入的信息会被发送到服务端,服务端会将信息转发给聊天室里的所有用户;聊天室的其他用户发送了信息,服务端会将信息转发给客户端,这个过程会一直循环,直到用户下线,然后将用户下线的信息转发到服务端,接着服务端会把这个用户从服务端的在线用户列表中移除。服务端的主线程会一直等待是否有新的用户发起连接请求。
  • ChatServer:监听客户端有没有发送连接请求,如果有的话,通过 accept 接受这个连接请求。保存在线用户的相关信息,可以构建一个hashMap,key存的是客户端的端口,value存的是一个Writer,它是字符流的输入类。
  • ChatHandler:真正的一对一的和每个客户进行信息的交换是在这个 handler 中完成的,一个客户对应一个 handler 线程。
  • ChatClient:和服务端建立连接,监听服务端那边传来的消息。
  • UserInputHandler:处理用户在控制台的输入,并且把用户输入的消息发送给服务端,因为等待用户的输入是一个阻塞性的过程,不能让它阻塞ChatClient线程,所以需要handler这个额外的线程。

NIO聊天室

  • 用Channel代替Stream。流是有方向的,输入流用来读取数据,输出流用来写入数据,而且流的读写都是阻塞的。Channel是双向的,一个Channel既可以写入数据也可以读取数据。
  • 使用Selector来监控多条Channel。可以在一个线程里处理多个Channel的输入输出。

BIO

  • 同步阻塞式IO模型: 服务端的线程会一直阻塞等待客户端发起请求,如果客户端一直不发起,那服务器端的线程会一直存在。
  • 弹性伸缩能力差: 每个客户端都会对应一个线程,对于上千万客户端的接入,会难以承受。
  • 多线程耗费资源: 线程的创建、销毁和阻塞等待,都会耗费CPU资源。

NIO

  • 同步非阻塞式IO模型: 服务器端提供一个单线程的 Selector 来同一管理所有客户端接入的 socket 连接,并负责监听每个客户端所关心的事件。
  • 弹性伸缩能力强: 因为服务端不再是多个线程来处理,而是一个线程来处理所有请求。
  • 单线程节约资源。

Java IO 和 NIO 的区别

  1. IO 面向流,NIO 面向缓冲区: IO 面向流是指每次从流中读取一个或多个字节,它们没有被缓存在任何地方,而且不能前后移动流中的数据。NIO 面向缓冲区是指将读取到的数据放到一个稍后处理的缓冲区,数据可以在缓冲区中前后移动,增加了灵活性。
  2. IO 是阻塞的,NIO 是非阻塞的。
  3. NIO 中提供了一个单线程的 Selector 来管理多个输入通道。
NIO 核心:
  • Channel(通道):双向性,非阻塞性,操作唯一性(只能通过 buffer 操作)。实现方式由 UDP 类的 DatagramChannel , 和 TCP 类的 ServerSocketChannel / SocketChannel 。
  • Buffer(缓冲区):读写 Channel 中的数据,本质是一块内存区域。
  • Selector(多路复用器)
NIO 编程实现步骤
  1. 创建 Selector。
  2. 创建 ServerSocketChannel,并绑定监听端口。
  3. 将 Channel 设置为非阻塞模式。
  4. 将 Channel 注册到 Selector 上,监听连接事件。
  5. 循环调用 Selector 的 select 方法,检测就绪情况。
  6. 调用 selectedKeys 方法获取就绪 Channel 集合。
  7. 判断就绪事件种类,调用业务处理方法。
  8. 根据业务需要,决定是否再次注册监听事件,重复执行第三步操作。

在这里插入图片描述
在这里插入图片描述


阻塞非阻塞、同步异步

阻塞:发起请求后,调用者会一直等待请求结果返回,此时线程被挂起,无法从事其他任务。
非阻塞:发起请求后,调用者不用等着结果返回,可以先去处理其他任务。

同步:发起调用后,需要等待处理结果才能返回。
异步:发起调用后,不需要等待处理结果,被调用者可以通过回调机制来通知调用者它的返回结果。

为什么分为字节流和字符流?

  • 字符流是由Java虚拟机将字节转换得到的,这个过程是比较耗时的,而且容易出现乱码问题,所以IO直接提供了操作字符的接口。
  • 编码就是把字符转换为字节,而解码是把字节重新组合成字符。
  • InputStreamReader 实现从字节流解码成字符流;
  • OutputStreamWriter 实现字符流编码成为字节流。

java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

Java 中的流分为两种,一种是字节流,另一种是字符流,每种流都包括输入和输出,所以一共四个:InputStream,OutputStream,InputStreamReader,OutputStreamWriter。

字节流和字符流的区别:

  1. 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
  2. 字节流提供了处理任何类型的 IO 操作的功能,但它不能直接处理 Unicode 字符,而字符流就可以。

NIO(与IO相比主要是非阻塞、面向块而不是面向流)

  • NIO意思是新的输入/输出库,也可以理解成 non-blocking IO ,同步非阻塞的IO模型。
  • IO和NIO主要的区别是,IO以流的方式处理数据,NIO以块的方式处理数据。
  • NIO 实现了 IO 多路复用中的 Reactor 模型,一个线程 Thread 使用一个选择器 Selector 通过轮询的方式去监听多个通道 Channel 上的事件,从而让一个线程就可以处理多个事件。通过配置监听的通道 Channel 为非阻塞,那么当 Channel 上的 IO 事件还未到达时,就不会进入阻塞状态一直等待,而是继续轮询其它 Channel,找到 IO 事件已经到达的 Channel 执行。
  • 因为创建和切换线程的开销很大,因此NIO使用一个线程来处理多个事件,对于 IO 密集型的应用具有很好的性能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值