zoukankan      html  css  js  c++  java
  • java进阶知识--网络编程

    一、网络编程入门

     1.1 软件结构

    •  C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。
    •  B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。

      两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序。

     1.2 网络通信协议

    • 网络通信协议:通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。

    • TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

      

      TCP/IP协议中的四层分别是应用层、传输层、网络层和数据链路层(物理层),每层分别负责不同的通信功能。
      数据链路层(物理层):用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
      网络层:整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
      运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
      应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议、DNS协议等。

    DNS(Domain Name System)  域名系统(域名解析器)

      将一个域名映射到对应的IP地址。也就是我们平时的访问地址。

     1.3 协议分类

       java.net 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。

       java.net 包中提供了两种常见的网络协议的支持:

    • UDP用户数据报协议(User Datagram Protocol)。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

       由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

       但是在使用UDP协议传送数据时,由于UDP面向无连接性,不能保证数据完整性,因此在传输重要数据时不建议使用UDP协议。

       另每个数据包的大小限制在64k以内

    小贴士:

    • 特点:数据被限制在64kb以内,超出这个范围就不能发送了。
    • 数据报(Datagram):网络传输的基本单位。
    • TCP传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据。它提供了两台计算机之间可靠无差错的数据传输,可以保证传输数据的安全。

       在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。

       三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

      • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。

      • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。

      • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。

     1.4 网络编程三要素

       1.4.1 协议

         协议:计算机网络通信必须遵守的规则。详见1.2、1.3的内容。

       1.4.2 IP地址

         IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。

            IP地址用来给一个网络中的计算机设备做唯一的编号。

         IP地址分类:

      •  IPv4:是一个32位的二进制数(4个字节),表示成a.b.c.d 的形式,例如192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。
      •  IPv6:采用128位地址长度(16个字节),分成8组十六进制数,例如ABCD:EF01:2345:6789:ABCD:EF01:2345:6789。

         常用命令:

      •  查看本机IP地址:ipconfig
      •  检查网络是否连通:ping IP地址

         特殊的IP地

      • 本机IP地址:127.0.0.1localhost

      JDK中提供了一个InetAdderss类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法.

       1.4.3 端口号

         网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,如何在网络通信时,区分这些进程呢?

         如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。

      • 端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

    小贴士:

    利用 协议+IP地址+端口号 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。

      1.5 资源分类

      • 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析。如: html,css,JavaScript ...
      • 动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,再返回给浏览器。如:servlet/jsp,php,asp ...

     

    二、TCP通讯程序

     2.1 概述

        TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

        两端通信时步骤:

      1. 服务端程序,需要事先启动,等待客户端的连接。

      2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

        在Java中,提供了两个类用于实现TCP通信程序:

      1. 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出请求,服务端响应请求,两者建立连接开始通信。

      2. 服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

     2.2 Socket

        该类实现客户端套接字套接字指的是两台设备之间通讯的端点

        构造方法

      • public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。

      • public Socket(InetAddress address, int port):创建套接字对象并将其连接到指定IP地址的指定端口号。

    小贴士:回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。

        成员方法

      • public InputStream getInputStream() : 返回此套接字的输入流。

        • 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。

        • 关闭生成的InputStream也将关闭相关的Socket。

      • public OutputStream getOutputStream() : 返回此套接字的输出流。

        • 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。

        • 关闭生成的OutputStream也将关闭相关的Socket。

      • public void close() :关闭此套接字。

        • 一旦一个socket被关闭,它不可再使用。

        • 关闭此socket也将关闭相关的InputStream和OutputStream 。

      • public void shutdownOutput() : 禁用此套接字的输出流。  

        • 任何先前写出的数据将被发送,随后终止输出流。

     2.3 ServerSocket类

         这个类实现了服务器套接字,该对象等待通过网络的请求。

        构造方法

      • public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。

        成员方法

      • public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

      • public InetAddress getInetAddress():返回此服务器套接字的本地地址。

     2.4 简单的TCP网络程序步骤

        1.【服务端】启动,创建ServerSocket对象,等待连接。
        2.【客户端】启动,创建Socket对象,请求连接。
        3.【服务端】接收连接,调用accept方法,并返回一个Socket对象。
        4.【客户端】Socket对象,获取OutputStream,向服务端写出数据。
        5.【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
        6.【服务端】Socket对象,获取OutputStream,向客户端回写数据。
        7.【客户端】Scoket对象,获取InputStream,解析回写数据。
        8.【客户端】释放资源,断开连接。

    三、UDP通讯协议

     3.1 DatagramPacket

      前面介绍了UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。UDP通信的过程就像是货运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样,发送和接收的数据也需要使用“集装箱”进行打包,为此JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。

      想要创建一个DatagramPacket对象,首先需要了解一下它的构造方法。在创建发送端和接收端的DatagramPacket对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号。

      接下来根据API文档的内容,对DatagramPacket的构造方法进行逐一详细地讲解。

       使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号。很明显,这样的对象只能用于接收端,不能用于发送端。因为发送端一定要明确指出数据的目的地(ip地址和端口号),而接收端不需要明确知道数据的来源,只需要接收到数据即可。

       使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样。

      上面我们讲解了DatagramPacket的构造方法,接下来对DatagramPacket类中的常用方法进行详细地讲解,如下表所示。

     3.2 DatagramSocket

      DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有“集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,发送数据的过程如下图所示。

      在创建发送端和接收端的DatagramSocket对象时,使用的构造方法也有所不同,下面对DatagramSocket类中常用的构造方法进行讲解。

       该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其它网络程序所使用的端口号。

       该构造方法既可用于创建接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口。

      上面我们讲解了DatagramSocket的构造方法,接下来对DatagramSocket类中的常用方法进行详细地讲解。

     小贴士:

    1.UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。

    2.要实现UDP通信需要创建一个发送端程序和一个接收端程序,很明显,在通信时只有接收端程序先运行,才能避免因发送端发送的数据无法接收,而造成数据丢失。

    四、HTTP(Hyper Text Transfer Protocol)超文本传输协议

     4.1 概述

        * 传输协议:定义了客户端和服务器端通信时,发送数据的格式
        * 特点:
          1. 基于TCP/IP的高级协议
          2. 默认端口号:80
          3. 基于请求/响应模型的:一次请求对应一次响应
          4. 无状态的:每次请求之间相互独立,不能交互数据
        * 历史版本:
          * 1.0版本:每一次请求响应都会建立新的连接
          * 1.1版本:复用连接

     4.2 请求消息数据格式

        1. 请求行
          请求方式 请求url 请求协议/版本
            GET    url   HTTP/1.1
          * 请求方式:
            * HTTP协议有7中请求方式,常用的有2种
            * GET:
              1. 请求参数在请求行中,在url后。
              2. 请求的url长度有限制的
              3. 不太安全
            * POST:
              1. 请求参数在请求体中
              2. 请求的url长度没有限制的
              3. 相对安全
        2. 请求头:客户端浏览器告诉服务器一些信息
          请求头名称: 请求头值
          * 常见的请求头:
            1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
              * 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
            2. Referer:http://localhost/login.html
              * 告诉服务器,我(当前请求)从哪里来?
              * 作用:
                1. 防盗链
                2. 统计工作
            3. 请求空行
              * 空行,就是用于分割POST请求的请求头和请求体的。
            4. 请求体(正文):
              * 封装POST请求消息的请求参数的

     4.3 响应消息数据格式 

        (... ...)

  • 相关阅读:
    批量新增百万条数据 十百万条数据
    sqlserver 组内排序
    EF ++属性会更新实体
    Entity Framework Core: A second operation started on this context before a previous operation completed
    abp Cannot access a disposed object. A common cause of this error is disposing
    abp xunit Can not register IHostingEnvironment. It should be a non-abstract class. If not, it should be registered before.”
    hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)
    EF 更新实体 The instance of entity type 'BabyEvent' cannot be tracked because another instance
    datatable to entiy list 不支持可空类型和枚举类型
    webapi 设置不显示接口到swaggerUI
  • 原文地址:https://www.cnblogs.com/sun9/p/13562867.html
Copyright © 2011-2022 走看看