Java网络编程
2022-07-07 16:00:22 0 举报
AI智能生成
对网络编程的初步认识
作者其他创作
大纲/内容
网络通信
IP协议
对应于网络层
TCP协议
对应于传输层
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输
TCP连接的三次握手
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”
TCP关闭连接的四次握手
UDP协议
对应于传输层
TCP和UDP的区别
TCP
TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性
UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议
HTTP协议
对应于应用层
HTTP是应用层协议,主要解决如何包装数据
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
socket
socket则是对TCP/IP协议的封装和应用(程序员层面上)
socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
socket也封装了UDP
socket通信模型
1、服务器监听
服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2、客户端请求
指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
3、连接确认
当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
网络编程
NIO
Buffer缓冲区
实例
ByteBuffer
CharBuffer
DoubleBuffer
IntBuffer
LongBuffer
ShortBuffer
属性
capacity
容量
position
读写位置
limit
界限
mark
标记,用于重复一个读/写操作
Channel通道
全双工的,支持读/写(而Stream流是单向的)
支持异步读写
和Buffer配合,提高效率
ServerSocketChannel,服务器TCP Socket接入通道,接收客户端
SocketChannel, TCP Socket通道,可支持阻塞/非阻塞通讯
DatagramChannel UDP通道
FileChannel文件通道
Selector多路选择器
每隔一段时间,不断轮询注册在其上的Channel。(一个Select对应多个)
如果有一个Channel有接入、读、写操作,就会被轮询出来
根据SelectionKey可以获取响应的Channel,进行后续IO操作
可以避免过多的线程
SelectionKey四种类型
OP_CONNECT,有人连接过来,CONNECT
OP_ACCEPT,连接成功,ACCEPT
OP_READ,读,read
OP_WRITE,写,write
BIO
AIO
Asynchronous I/O,异步I/O
JDK1.7引入,主要在java.nio包中
异步I/O,采用回调方法进行处理读写操作
主要类
AsynchronousServerSocketChannel
bind,绑定在某一个端口 accept 接受客户端请求
AsychronnousSocketChannel
read 读数据, write写数据
CompletionHandler
completed操作完成后异步调用方法,failed操作失败后异步调用方法
Netty
通道 Channel
ServerSocketChannel/NioSerSocketChannel
SocketChannel/NioSocketChannel
与NIO/AIO不同的是,它是基于事件EventLoop驱动的
1. 事件驱动为每个通道定义一个EventLoop,处理所有的I/O事件
2. EventLoop将事件派发给ChannelHander
3. EventLoop安排进一步操作
事件
事件按照按照数据流向进行分类
1.入站事件:连接激活/数据获取/...
2.出站事件:打开到远程连接/写数据/...
事件处理ChannelHangler
Channel通道发生数据或状态改变
EventLoop会将事件分类,并调用ChannelHandler的回调函数
程序员需要实现ChannelHandler内的回调函数
回调函数:ChannelInboundHandler/ChannelOutboundHander
ChannelHandler工作模式:责任链
责任链模式
将请求的接收者连成一条链
在链上传递请求,直到有一个接收者处理该请求
避免请求者和接收者的耦合
ChannelHandler可以有多个,依次进行调用
ChannelPipeline作为容器,承载多个ChannelHandler
ByteBuf
强大的字节容器,提供丰富的API进行操作
0 条评论
下一页