曹阳的博客 仅用于学习和分享

Java网络常识、设计原则、查找排序

2019-11-15

核心类库D7:网络编程的常识、基于tcp协议的编程模型、常用的设计原则、常用的设计模式、常用的查找算法、常用的排序算法

1.网络编程常识

1.1 七层网络模型

  1. ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层:
  2. 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
  3. 当发送数据时,需要对发送的内容按照上述七层模型进行层层加包再发送出去;
  4. 当接收数据时,需要对接受的内容按照上述七层模型相反的次序层层拆包再解析出来

1.2 IP地址(重点)

  1. 如:192.168.1.1 - 是绝大多数路由器的登录地址,进行账号密码的配置以及Mac地址过滤
  2. IP地址 - 是互联网中的唯一标识,用于定位到具体某一台设备。
  3. IP地址本质上是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前主流的还是IPv4.
  4. 日常生活中采用点分十进制表示法进行IP地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的十进制整数之间采用小数点隔开。
    0x01020304 => 1.2.3.4

1.3 端口号(重点)

  1. IP地址 - 可以定位到具体某一台设备。
  2. 端口号 - 可以定位到具体某一个进程。
  3. 网络编程需要提供:IP地址 + 端口号。
  4. 端口号本质上是由16位二进制组成的整数,表示的范围:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此开发中从1025开始使用

2.基于tcp协议的编程模型(重点)

2.1 编程模型

  1. 服务器:
    • 创建ServerSocket类型的对象并提供端口号;
    • 等待客户端的连接请求,调用accept方法;
    • 使用输入输出流进行通信;
    • 关闭Socket;
  2. 客户端:
    • 创建Socket类型的对象并提供服务器的IP地址和端口号;
    • 使用输入输出流进行通信;
    • 关闭Socket;

2.2 ServerSocket类

  1. java.net.ServerSocket类主要用于描述服务器套接字信息
  2. 常用方法
    • ServerSocket(int port):根据参数指定的端口号来构造对象
    • Socket accept():监听并接收到此套接字的连接请求
    • void close():用于关闭套接字
  3. Socket类
    • java.net.Socket类主要用于描述客户端套接字,是两台机器间通信的端点。
    • 常用方法
      1. Socket(String host,int port):根据指定主机名和端口来构造对象
      2. InputStream getInputStream():用于获取当前套接字的输入流
      3. OutputStream getOutputStream():用于获取当前套接字的输出流
      4. void close():用于关闭套接字

2.3 练习:

  1. 要求实现服务器接收到客户端发来的消息后向客户端回发消息”I received!”
  2. 要求实现客户端向服务器发送的内容由用户从键盘输入
  3. 要求实现客户端和服务器不断地通信,直到客户端发送”bye”聊天结束
  4. 要求服务器可以不断地响应客户端的连接请求,采用多线程技术

3.常用的设计原则

3.1 软件开发的流程

需求分析文档 => 概要设计文档 => 详细设计文档 => 编码和测试 => 安装和调试 => 维护和升级

3.2 常用的设计原则(记住)

  1. 开闭原则 - 对扩展开放,对修改关闭。

     public class Person {    
        private String name;    
        ... ...    
     }     
     public class SubPerson extends Person {    
    		
        private int age;    
     }
    
  2. 里氏代换原则 - 任何父类可以出现的地方,子类一定可以出现(子类 is a 父类,建议多使用多态)

     public static void printShape(Shape s) {    
        s.show();    
     }    
     printShape(new Rect(1, 2, 3, 4));    
     printShape(new Circle(5, 6, 7));    
    
  3. 依赖倒转原则 - 尽量多依赖于抽象类和接口而不是具体实现类,抽象类对子类具有强制性和规范性。

     public abstract class Account {    
    		
         public abstract double getLixi();    
     }    
     public class FixedAccount extends Account {    
         @Override    
         public double getLixi() {  }    
     }    
    
  4. 接口隔离原则 - 尽量多依赖于小接口而不是大接口,避免接口的污染

     public interface RunAnimal {    
        public abstract void run();    
     }    
     public interface FlyAnimal {    
        public abstract void fly();    
     }    
     public class Dog implements RunAnimal {    
        @Override    
        public void run() {}    
     }
    
  5. 迪米特法则(最少知道原则) - 一个实体(模块)应当少于其它实体之间发生关联。
    • 高内聚,低耦合
    • 所谓高内聚就是指一个实体应该有的功能应当尽量高度聚集于该实体的内部。
    • 所谓低耦合就是指一个实体应当减少与其它实体之间的关联度。
  6. 合成复用原则 - 尽量多使用合成的方式,而不是继承的方式。

     public class A {    
       public void show() {  ... }    
     }    
     public class B extends A{   - 不推荐    
    		
       public void test() {    
           // 调用类A的show方法    
           show();    
       }    
     }    
     public class B {   - 推荐    
       private A a;    
       public B(A a) {    
          this.a = a;    
       }    
    		
       public void test() {    
           // 调用类A的show方法    
           a.show();    
       }    
     }
    

4.常用的设计模式

4.1 基本概念

设计模式就是多年代码经验的总结,主要用于固定的场合中。

4.2 常用的设计模式(重点)

单例设计模式、模板设计模式、工厂方法模式、抽象工厂模式

5.常用的查找算法(重点)

5.1 线性(顺序)查找算法

5.2 二分(折半)查找算法

6.常用的排序算法

6.1 冒泡排序算法(重中之重)

作业:

  1. 重点掌握线程同步的代码 和 基于tcp协议编程模型的代码。
  2. 使用基于tcp协议的编程模型实现将Message类型对象由客户端发送给服务器;
    服务器接收到对象后判断用户对象信息是否为”admin”和”123456”,若是则将
    Message对象中的类型改为”sucess”,否则将类型改为”failed”并回发给客户端
    客户端接收到服务器发来的对象后判断并给出提示。
    其中Message类的特征有:类型(字符串类型) 和 用户对象(User类型)。
    其中User类的特征有:用户名、密码(字符串类型)。
    如:
    Message tm = new Message(“check”, new User(“admin”, “12345”));
  3. 复习所有内容准备明天的阶段考试。
  4. 重点掌握6大原则和算法。
  5. 复习和总结JavaSE的所有内容。

Content