文章目录
简介
- 本文是2021/05/06整理的笔记
- 赘述可能有点多,还请各位朋友耐心阅读
- 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进
网络通讯知识点总结
概念
TCP协议
- 全称:Transmission Control Protocol
- 传输控制协议 面向连接可靠 字节流传输的传输控制协议
UDP协议
- 全称:User Datagram Protocol
- 用户数据报协议 无连接 不可靠 处理数据报的协议
IP协议
- Internet Protocol
- 网络协议 把数据从源传输到目的地。不保证可靠 顺序
ICMP协议
- 全称:Internet Control Message Protocol
- 网络控制报文协议 主机和路由器之间传递数据
IGMP协议
- 全称:Internet Group Message Protocol
- 网络组报文协议 组播,运行在主机和组播路由器之间
ARP协议
- 全称:Address Resolution Protocol
- 地址解析协议 根据IP地址获取主机的物理地址
HTTP协议
- 全称:Hyper Text Transfer Protocol
- 超文本传输协议 web服务器传输超文本到本地浏览器的协议
FTP协议
- 全称:File Transfer Protocol
- 文本传输协议 在Internet控制文件的双向传输的协议
IP = 子网(网络号:前3个字节)+ 主机号(最后一个字节)
- 例如:192.168.79.主机号
TCP和UDP的区别
- TCP:面向连接 可靠 顺序 字节流模式
- UDP:不面向连接 不可靠 不保证顺序 数据报模式
HTTP请求方式
- GET:浏览器地址栏输入网址;网页超链接 form表单不写method属性或者method=“get” 服务器返回响应头 响应体
- POST:form method=“post” 服务器返回响应头 响应体
- HEAD:服务器只返回响应头
HTTP协议的请求结构
大体:
- 请求行\r\n
- 请求头\r\n
- 空行\r\n
- 请求体
细分:
- GET请求结构
GET 请求资源url?参数名=参数值&参数名=参数值 HTTP/版本号\r\n
Accept-Language:zh-cn\r\n
Host: localhost\r\n
User-Agent: Mozila/…\r\n
Acept-Encoding:gzip\r\n
\r\n
GET没有请求体 - POST请求结构
POST 请求资源 url HTTP/版本号\r\n
Accept-Language:zh-cn\r\n
Host: localhost\r\n
User-Agent: Mozila/…\r\n
Acept-Encoding:gzip\r\n
Content-Length: 36
\r\n
参数名=参数值&参数名=参数值
HTTP协议的响应结构
大体:
- 响应行\r\n
- 响应头\r\n
- 空行\r\n
- 响应体
细分:
状态行
HTTP/1.1 200 OK
响应头
Date: 日期时间 响应发出的时间\r\n
Content - Type:text/html ;charset = UTF - 8 服务器告诉浏览器自己能响应的对象的类型\r\n
User - Agent:用户代理说白了就是当前使用的浏览器的类型名称和对应的版本信息\r\n
content-Length: 300 响应体的字节长度\r\n
空行\r\n
< html >
< head >
< title > 标题 < /title >
< /head >
< body >
内容
< /body >
< /html >
重要的响应状态码
200 OK 一切正常
404 NotFound 请求的资源未找到
500 Server Internal Error服务器内部错误
Socket知识点总结
服务端ServerSocket
- 创建
ServerSocket serverSocket = new ServerSocket(8888); - 调用accept方法监听客户端发来的请求:Socket socket = serverSocket.accept();
- 开管:得到输入和输出流
InputStream in = socket.getInputStream()
OutputStream out = socket.getOutputStream(); - 使用输入流得到信息,使用输出流向客户端发信息
客户端
- 创建
Socket socket = new Socket(IP,8888); - 开管:得到输入和输出流
InputStream in = socket.getInputStream()
OutputStream out = socket.getOutputStream(); - 使用输出流发信息(socket.shutdownOutput()输出-1标志),使用输入流得到信息
NIO
- 通道:channel 铁轨
- 缓冲区 buffer 火车
- 选择器(Selector):是SelectableChannel的多路复用器,用于监控SelectableChannel的IO状况(选择器不能监控FileChannel)
ByteBuffer
ByteBuffer抽象类
子类
ByteBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer CharBuffer
常用方法
- allocate:position 0 limit = capacity
- put(byte[]):position:byte[].length limit = capacity
- 切换到读模式:position:0 limit = 5 capacity=10
- get(byte[] dest) position:5 limit=5 capacity=10
- rewind()重复读:position回到0 limit:5 capacity:10不变
- clear():清空缓冲区 position:0 limit=capacity=10
- mark()标记position的当前位置
- reset()回到标记的位置
Channel接口
Channel接口的主要实现类
- FileChannel
- ServerSocketChannel
- SocketChannel
- DatagramChannel
- Pipe.SinkChannel
- Pipe.SourceChannel
Channel接口的特点
- 双向
- 异步读写
同步:等待你回来,你不回来,我啥都不干,死等
异步:我做我的事,你打你的饭,互不耽误,商定饭放的位置 - 通过Buffer读写
获取通道的3种方式
- Java对支持通道的类提供了getChannel()方法,使用以下的类的getChannel()方法能获取通道
(1)本地IO
FileInputStream/FileOutputStream
RandomAccessFile
(2)网络IO
socket
ServerSocket
DatagramSocket - 在JDK1.7中的NIO2针对各个通道类提供了静态方法open()
- 在JDK1.7中的NIO2的Files工具类的newByteChannel()
NIO实现文件拷贝
- 得到输入输出流
- 得到通道
- 分配缓冲区
- 循环读取
- 读模式
- 写
- clear
- //读取数据实现拷贝
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(inputStreamChannel.read(buffer)!=-1){
//切换到读模式
buffer.flip();
//将缓冲区中的数据写到输出通道
outputStreamChannel.write(buffer);
buffer.clear();
}
- inChannel.transferTo() outChannel.transferFrom()
- close
UDP的服务端开发步骤
使用DatagramSocket(port)创建DatagramSocket对象,指定端口号,ip是本机,用来接收数据
创建DatagramPakcet对象,包括缓冲区及缓冲区大小:new DatagramPakcet(byte[ ] buf,int length)
接收数据:DatagramSocket.receive(DatagramPakcet)
得到接收的数据:从哪个ip的端口号发来的什么数据,数据多长
UDP的客户端开发步骤
创建DatagramSocket对象,指定端口号(不要跟服务器端口重复),ip是本机,用来发送数据
创建DatagramPacket对象,包括发送数据的缓冲区字节数组,发送数据的长度,目标地址和端口号
发送数据:DatagramSocket.send(DatagramPacket)