一、Socket
1、网络模型简介
- 互联网兴起后,相应的标准也应运而生
- ISO/OSI是因国际标准组织(ISO)提出的一个互联网的理论参考模型,分为七层,并没实际产品
TCP/IP是事实上的互联网络标准,分为****四层,包含了众多实际应用的协议 - 面对用户数据的传输
- 发送端会将数据从高层向底层逐步封装,并添加自己的头部,直到物理层使用二进制传输
- 接收端则会从底层往高层逐步解除封装,解析成接收到可以读取的数据
2、IP地址
- 在互联网络中,各种主机间相互通信,都需要一个唯一的标识,就是IP地址
- IPv4地址由32位组成,IPv6地址由128位组成,IPv4地址已经耗尽
- IPv4一般习惯性分为4个8位展现,比如192.168.1.1
- IPv4基础概念
- IP地址:192.168.72.129
- 子网掩码:255.255.255.0
- 对应网段:192.168.72.0,该网段可用主机为192.168.72.1~192.168.72.254,192.168.72.255为广播地址,不同网段是天然隔离的
- 127.0.0.1:本机地址,对应域名是localhost
- 为了解决网络地址不够的问题,IPv4中推出了企业中常见的私有网络IP地址,能在不同的企业网络中各自使用;如果需要访问互联网络,则可整个网络映射一个或多个公有网络IP地址
- 10.0.0.0~10.255.255.255
- 172.16.0.0~172.31.255.555
- 192.168.0.0~192.168.255.255
- 域名
- IP地址不好记忆,就可以使用域名并绑定相应的IP地址
- 域名-》IP地址的解析需要域名解析服务器DNS来处理
3、MAC地址
- MAC地址(Media Access Control Address),也称物理地址,用48位二进制表示在TCP/IP中处于数据链路层,是给网络中的每一台设备做唯一标识的,如每张网卡都有一个MAC地址
- 区别于IP地址可以动态分配和绑定,MAC地址是出厂就烧入设备,一般不可修改
- 网络中设备间的消息发送,是会传递自身的IP地址和MAC地址做为标识的
- 可通过ipconfig /all查看主机网卡的MAC地址
4、Socket简介
- **所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。 **
- **Scoket是通信的基石,是支持TCP/IP协议的路通信的基本操作单元 **
- Socket网络编程独立于语言,相比RMI性能更好
- java.net包中提供了网络通讯的Socket相关操作的类,提供了ServerSocket、Socket等类
- 可能使用前端的WebSocket与后端的WebSocket对接实现长连接
- 可以通过netstat –t查看socket连接的tcp端口情况
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等
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 的主要实现有:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
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()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。
欢迎来到testingpai.com!
注册 关于