JavaSEDemo33

╰+攻爆jí腚メ 2021-09-25 08:34 340阅读 0赞

文章目录

  • 简介
  • 网络通讯知识点总结
    • 概念
      • TCP协议
      • UDP协议
      • IP协议
      • ICMP协议
      • IGMP协议
      • ARP协议
      • HTTP协议
      • FTP协议
    • IP = 子网(网络号:前3个字节)+ 主机号(最后一个字节)
    • TCP和UDP的区别
    • HTTP请求方式
    • HTTP协议的请求结构
    • HTTP协议的响应结构
    • 重要的响应状态码
  • Socket知识点总结
    • 服务端ServerSocket
    • 客户端
    • NIO
    • ByteBuffer
    • Channel接口
      • Channel接口的主要实现类
      • Channel接口的特点
    • 获取通道的3种方式
    • NIO实现文件拷贝
    • UDP的服务端开发步骤
    • UDP的客户端开发步骤

简介

  • 本文是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的区别

  1. TCP:面向连接 可靠 顺序 字节流模式
  2. UDP:不面向连接 不可靠 不保证顺序 数据报模式

HTTP请求方式

  1. GET:浏览器地址栏输入网址;网页超链接 form表单不写method属性或者method=“get” 服务器返回响应头 响应体
  2. POST:form method=“post” 服务器返回响应头 响应体
  3. HEAD:服务器只返回响应头

HTTP协议的请求结构

大体:

  1. 请求行\r\n
  2. 请求头\r\n
  3. 空行\r\n
  4. 请求体

细分:

  1. 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没有请求体
  2. 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协议的响应结构

大体:

  1. 响应行\r\n
  2. 响应头\r\n
  3. 空行\r\n
  4. 响应体

细分:
状态行
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

  1. 创建
    ServerSocket serverSocket = new ServerSocket(8888);
  2. 调用accept方法监听客户端发来的请求:Socket socket = serverSocket.accept();
  3. 开管:得到输入和输出流
    InputStream in = socket.getInputStream()
    OutputStream out = socket.getOutputStream();
  4. 使用输入流得到信息,使用输出流向客户端发信息

客户端

  1. 创建
    Socket socket = new Socket(IP,8888);
  2. 开管:得到输入和输出流
    InputStream in = socket.getInputStream()
    OutputStream out = socket.getOutputStream();
  3. 使用输出流发信息(socket.shutdownOutput()输出-1标志),使用输入流得到信息

NIO

  1. 通道:channel 铁轨
  2. 缓冲区 buffer 火车
  3. 选择器(Selector):是SelectableChannel的多路复用器,用于监控SelectableChannel的IO状况(选择器不能监控FileChannel)

ByteBuffer

ByteBuffer抽象类
子类
ByteBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer CharBuffer
常用方法

  1. allocate:position 0 limit = capacity
  2. put(byte[]):position:byte[].length limit = capacity
  3. 切换到读模式:position:0 limit = 5 capacity=10
  4. get(byte[] dest) position:5 limit=5 capacity=10
  5. rewind()重复读:position回到0 limit:5 capacity:10不变
  6. clear():清空缓冲区 position:0 limit=capacity=10
  7. mark()标记position的当前位置
  8. reset()回到标记的位置

Channel接口

Channel接口的主要实现类

  1. FileChannel
  2. ServerSocketChannel
  3. SocketChannel
  4. DatagramChannel
  5. Pipe.SinkChannel
  6. Pipe.SourceChannel

Channel接口的特点

  1. 双向
  2. 异步读写
    同步:等待你回来,你不回来,我啥都不干,死等
    异步:我做我的事,你打你的饭,互不耽误,商定饭放的位置
  3. 通过Buffer读写

获取通道的3种方式

  1. Java对支持通道的类提供了getChannel()方法,使用以下的类的getChannel()方法能获取通道
    (1)本地IO
    FileInputStream/FileOutputStream
    RandomAccessFile
    (2)网络IO
    socket
    ServerSocket
    DatagramSocket
  2. 在JDK1.7中的NIO2针对各个通道类提供了静态方法open()
  3. 在JDK1.7中的NIO2的Files工具类的newByteChannel()

NIO实现文件拷贝

  1. 得到输入输出流
  2. 得到通道
  3. 分配缓冲区
  4. 循环读取

    1. 读模式
    2. clear
    3. //读取数据实现拷贝
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(inputStreamChannel.read(buffer)!=-1){
      //切换到读模式
      buffer.flip();
      //将缓冲区中的数据写到输出通道
      outputStreamChannel.write(buffer);
      buffer.clear();
      }
  5. inChannel.transferTo() outChannel.transferFrom()
  6. close

UDP的服务端开发步骤

使用DatagramSocket(port)创建DatagramSocket对象,指定端口号,ip是本机,用来接收数据
创建DatagramPakcet对象,包括缓冲区及缓冲区大小:new DatagramPakcet(byte[ ] buf,int length)
接收数据:DatagramSocket.receive(DatagramPakcet)
得到接收的数据:从哪个ip的端口号发来的什么数据,数据多长

UDP的客户端开发步骤

创建DatagramSocket对象,指定端口号(不要跟服务器端口重复),ip是本机,用来发送数据
创建DatagramPacket对象,包括发送数据的缓冲区字节数组,发送数据的长度,目标地址和端口号
发送数据:DatagramSocket.send(DatagramPacket)

发表评论

表情:
评论列表 (有 0 条评论,340人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaSEDemo06

    文章目录 简介 显示继承与隐式继承 继承的重点 继承与构造方法 继承的优点和缺点 final关键字 多重继承时构造方法的执行情况

    相关 JavaSEDemo05

    文章目录 简介 void方法中return语句的使用规范 可变API与不可变API 数据交换与方法传参 为什么不能用返回值类型来判断方法是否