Socket

本贴最后更新于 689 天前,其中的信息可能已经沧海桑田

一、Socket

1、网络模型简介

1649211711506.png

2、IP地址

3、MAC地址

4、Socket简介

1、单线程版本

缺点:吞吐量低,连续两次阻塞,accept和read,

2、多线程版本

优点:把read阻塞给优化了,这里不会阻塞其他线程了,只会在自己的线程里面阻塞,提高了并发能力,提高了效率**
**缺点:这里有可能会无限制创建线程,线程是稀有资源,如果请求很多,这个时候客户端一直不执行write方法,所有线程就会阻塞在read方法那里,导致线程暴涨,cpu升高,导致机器假死。

**有人会说,我们可以把new Thread方式改成线程池处理,这里用线程池确实没问题,但是并没有解决我上面说的问题,这样就会导致线程池一直执行拒绝策略,持续不断报错,线程池一直处于打满状态,也是很危险的 **

3、NIO( non-blocking IO )

java 1.4版本推出了一种新型的IO API,与原来的IO具有相同的作用和目的;可代替标准java IO,只是实现的方式不一样,NIO是面向缓冲区、基于通道的IO操作;通过NIO可以提高对文件的读写操作。基于这种优势,现在使用NIO的场景越来愈多,很多主流行的框架都使用到了NIO技术,如Tomcat、Netty、Jetty等

1649237521162.png

NIO与传统IO的对比
NIO IO
面向缓冲区Buffer 面向流Stream
双向(基于通道Channel) 单向(分别建立输入流、输出流)
同步非阻塞(non-blocking) 同步阻塞
选择器(Selector,多路复用)
主要核心原理

主要包括:缓冲区(Buffer)、通道(Channel)和选择器(Selector)、字符集(Charset)

1、Channel概述

Channel翻译成“通道”,Channel 和 IO 中的 Stream(流)是差不多一个等级的。

只不过 Stream 是单向的,譬如:InputStream, OutputStream。

**而Channel 是双向的,**既可以用来进行读操作,又可以用来进行写操作

NIO 中的 Channel 的主要实现有:

2、Buffer

NIO 中的关键 Buffer 实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer,IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double,float, int, long, short。

3、Selector

一个Selector可以监听多个channel,如果channel中有他关心的事件发生,就可以通过SelectionKey获取到内容,最终完成操作。

Selector 运行单线程处理多个 Channel,如果你的应用打开了多个通道,但每个连接的流量都很低,使用 Selector 就会很方便。例如在一个聊天服务器中。要使用Selector, 得向 Selector 注册 Channel,然后调用它的 select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。

1649238928574.png

  • Java
    59 引用 • 497 回帖 • 2 关注
回帖
请输入回帖内容 ...