今日内容

  • 网络编程
  • TCP通信
  • Junit单元测试
  • 单例设计模式
  • 多例设计模式
  • 工厂设计模式

    1.网络编程

    1.1软件架构

  • C/S结构:全程为Client/Server结构,是指客户端和服务器结构

  • B/S结构:全程为Browser/Server结构,是指游览器和服务器结构
  • 两种架构各有优势,但是都不离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序

    1.2什么是网络编程

  • 在网络通信协议下,不同计算机上运行的程序,可以进行数据传输

  • (就是可以让两台计算机进行数据交互)

    1.3网络编程三要素

  • IP地址:设备在网络中的地址,是唯一的标识

  • 端口:应用程序在设备中唯一的标识
  • 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议

    1.4 IP地址(概述,掌握IP地址的获取和使用)

  • IP:全程”互联网协议地址“,也称IP地址。是分配给上网设备的数字标签。常见的IP分类为ipv4和ipv6

  • 简单来说:就是设备在网络中的唯一标识,想要连接哪一台电脑,就找到此电脑在网络中的ip地址
  • IP地址常见分类:ipv4和ipv6
  • 常用命令:
    • ipconfig:查看本机IP地址
    • IP地址:检查网络是否连通
  • 特殊IP地址:
    • 127.0.0.1:是回送地址也称本地回环地址,可以代表本机的IP地址,一般用来测试使用
  • 为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress供我们使用
  • InetAddress:此类表示Internet协议(IP地址) | static InetAddress getByName(String host) | 在给定主机名的情况下确定主机的IP地址 | | —- | —- | | String getHostName() | 获取此IP地址的主机名 | | String getHostAddress() | 返回IP地址字符串(以文本表现形式) |

1.5端口(注意端口的使用)

  • 端口:应用程序在设备中的唯一标识
  • 端口号:应用程序的唯一标识方式,用两个字节表示的整数,它的取值范围是0-65535

注意:其中0-1023之间的端口号用于一些知名的网络服务或者应用,我们自己使用1024以上的端口号就可以了
一个端口号只能被一个应用程序使用

1.6 通信协议(区分UDP协议和TCP协议)

  • 协议:计算机网络中,连接和通信的规则被称为网络通信协议 | UDP协议 | 用户数据报协议
    User Datagram Protocol | UDP是面向无连接的通信协议 | 速度块,有大小限制一次最多发送64K,数据不安全,易丢失数据 | | —- | —- | —- | —- | | ★TCP协议 | 传输控制协议
    Transminssion Control Protocol | TCP协议是面向连接的通信协议 | 速度慢,没有大小限制,数据安全 |

2.TCP协议

2.1TCP发送数据(相关步骤:客户端和服务端)

  • 客户端:
    • 发送数据的步骤:
  • 1.创建客户端的Socket对象:Socket(String host , int port)与指定服务端连接
    • 参数说明:
      • host表示服务器端的主机名,也可以是服务器端的IP地址,只不过是String类型的
      • port 表示服务器端的端口
  • 2通过获取Socket对象取得网络中的输出流,写数据( OutputStream getOutputStream())
  • 3.释放资源

    1. - void close()

    2.2TCP接收数据

  • 服务端接收数据:

    • 1.创建服务器端的Socket对象:ServerSocket类
      • ServerSocket( int port):构造方法需要绑定一个端口号,port就是端口号
    • 2.监听客户端连接,并接收连接,返回一个Socket对象
      • Socket accept():该方法会一直阻塞直到建立连接
    • 3.获取网络中的输入流,用来读取客户端发送过来的数据
      • InputStream getInputStream()
    • 4.释放资源:服务端一般不会关闭
      • void close()

        2.3TCP通信原理分析

  1. accept方法是阻塞的(死等),作用是等待客户端连接
  2. 客户端创建对象连接服务端,此时是通过三次握手协议保证和服务器连接成功
  3. 客户端发数据,数据是往外出的,使用的是输出流,服务器是接收数据,数据是进的,使用的是输入流
  4. 4.read方法也具备阻塞作用
  5. 在关流时,close方法也会写一个结束标记

    2.4三次握手

  6. 客户端—>服务器端,客户端向服务器发出连接请求(等待服务器确认)

  7. 服务器端—>客户端,服务器向客户端返回一个响应,告诉客户端收到了一个请求
  8. 客户端—>服务器端:客户端向服务器在此发出确认信息,连接建立

    2.5 TCP练习1

  • 发送数据的步骤(客户端)
  1. 创建客户端的Socket对象:Socket(String host , int port)与指定服务端连接
    1. 参数说明:
      1. host表示服务器端的主机名,也可以是服务器端的IP地址,只不过是String类型的
      2. port表示服务器端的端口
    2. 通过Socket对象获取网络中的输出流,写数据
      1. OutputStream getOutputStream()
    3. 释放资源
  • 服务器端接收数据
  1. 创建服务器端的Socket对象:ServerSocket类
    1. ServerSocket(int port):构造方法需要绑定一个端口号,port就是端口号
  2. 监听客户端连接,并接收连接,返回一个Socket对象
    1. Socket accept():该方法会一直阻塞直到建立连接
  3. 获取网络中的输入流,用来读取客户端发送过来的数据
    1. InputStream getInputStream()
  4. 释放资源:服务器一般不会关闭

    3.Junti单元测试

    3.1Junit单元测试概述

  • 单元测试就是编写测试代码,可以准确、快速地保证程序的正确性,Junit是java单元测试的框架
  • JUnit4可以用过注解的方式来标记方法,让方法存在某种意义,常见的注解有:
    • @BeforeClass 全局只会执行一次,而且是第一个运行(标记的方法需要一个静态无参无返回值方法)
    • @Before在测试方法运行之前运行(非静态无参无返回值方法)
    • @Test测试方法(此方法必须是非静态无参无返回值方法),主要用于测试的方法
    • @After在测试方法运行之后运行(非静态无参无返回值方法)
    • @AfterClass全局只会执行一次,而且是最后一个运行(标记的方法需要的是一个静态无参无返回值方法)

3.2Junit的基本使用

  • 已知存在需要测试的类Calculator,这是一个能够简单实现加减乘除、平方、开方的计算器类,然后对这些功能进行单元测试

    3.2.1限时测试

  • 对于那些逻辑很复杂,循环嵌套比较深的程序,很有可能出现死循环,因此一定要采取一些预防措施。限时测试是一个很好的解决方案。我们给这些测试函数设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报函数结束的原因是因为超时,这样你就可以发现这些Bug了。

  • 测试方法:

public void squareRoot(int n){
//Bug:死循环
for( ; ; );
}

3.3断言

  • 概述:预先判断某个条件一定成立,如果不成立,则直接报错

    4.单例设计模式

  • 产生原因:因为有时候一个对象就能完成的任务,非要创建多个对象,浪费内存!

    4.1 单例设计模式的作用

  • 单例模式,是一种常见的软件设计模式。通过单例模式可以保障项目中,应用该模式的这个类只有一个实例

  • 即一个类只有一个对象实例
  • 好处:可以节省内存,共享数据

    4.2单例设计模式实现步骤

  1. 将构造方法私有化,使其不能再类的外部通过new关键字实例化该类对象。
  2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量
  3. 定义以恶搞静态方法返回这个唯一对象

    4.3单例设计模式的类型

    根据创建对象的时机,单例设计模式又分为以下两种

  4. 饿汉单例设计模式

  5. 懒汉单例设计模式

    4.4饿汉单例设计模式

  • 饿汉单例设计模式就是使用类的时候已经将对象创建完毕
  • 不管以后会不会使用该实例化对象,先创建了再说。

    4.5懒汉单例设计模式

  • 懒汉单例设计模式就是调用getInstance()方法时对象才被创建

  • 也就是说不急着实例化对象,等要用的时候才实例化对象
  • 注意:
    • 懒汉单例设计模式在多线程环境下可能会实例化出多个对象,不能保证单例的状态,所以加上关键字:synchoronized,保证同步安全

知识小结:

  • 单例模式可以保证系统中一个类只有一个对象实例
  • 实现单例模式的步骤

    • 将构造方法私有化,使其不能再类的外部通过new关键字实例化该类对象
    • 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量
    • 定义一个静态方法返回这唯一对象

      5.多例设计模式

      5.1多例设计模式的作用

  • 多例模式,是一种常用的设计模式之一。通过多例模式可以保证项目中,应用该模式的类有固定数量的实例

  • 多例类要自我创建并管理自己的实例们还要向外界提供本类实例的方法
  • 使用场景:线程池
    • 线程池 = Executors . newFixedThreadPool(3);

      5.2实现步骤

  1. 创建一个类,将构造方法私有化,使其不能再类的外部new 关键字实例化该类对象
  2. 在类中定义该类被创建对象的总数量
  3. 在类中定义存放类实例的list集合
  4. 在类中提供静态代码块,在静态代码块中创建类的实例
  5. 提供获取类实例的静态方法

    6.工厂设计模式

    6.1概述

  • 工厂模式(Factory pattern)是java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。之前我们创建类对象时,都是使用new对象的形式创建,除了new对象方法意外,工厂模式也能创建对象

    6.2作用

  • 解决类与类之间的耦合问题

    6.3案例实践

  • 需求:定义汽车工厂类,生产各种品牌的车

  • 实现步骤
    • 编写一个Cat接口,提供run方法
    • 编写一个Falali类实现Car接口,重写run方法
    • 编写一个Benchi类实现Car接口,重写run方法
    • 编写一个CarFactory(汽车工厂),用于生产汽车对象
    • 定义CarFactoryTest测试汽车工厂