黑马程序员——网络编程与设计模式

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、网络编程

1、网络的概述

              网络就是计算机与计算机之间进行通信 

2、网络编程三要素:IP  端口  协议

       3、IP地址

                    a、它是网络中的设备标识

                   b、不易记忆,可用主机名表示,两者存在映射关系

                           c、本机回环地址:127.0.0.1,主机名为:localhost。

IP地址:java中对应的是InetAddress类,存在于java.net包中。

                     IP的每一位数不超过256

        (1)IP地址的分类:

            A类 1.0.0.1---127.255.255.254   (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) (2)127.X.X.X是保留地址,用做循环测试用的。

            B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。

            C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址

            D类 224.0.0.1---239.255.255.254

            E类 240.0.0.1---247.255.255.254

        (2)IP地址的组成:

        IP地址 = 网络号码+主机地址

        A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码

            256*256*256   --- 16777216

        B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码

            256*256    --- 65536

        C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码

            256

              4、端口号:

a、用于标识进程的逻辑地址,不用进程的标识。

b、有效端口:0 ~65535,系统使用或保留的端口是:0~ 1024

5、传输协议:

                          即通信规则,包含TCP和UDP协议

                     TCP协议的特点:

                     建立连接通道

                     数据无限制

                     面向连接(三次握手)

                     可靠

                     速度慢

                     UDP协议的特点:

                     把数据打包

                     数据有限制

                     面向无连接

                     不可靠

                     速度快

       6、Socket

              Socket是Internet主机上(计算机)提供的服务

              Socket编程 套接字编程  网络编程 

              InetAdress:java中计算机IP对应的类

              publicstatic InetAddress getByName(String host)

              IP地址:public String getHostAddress()           

             主机名:public String getHostName() 

       7、面向UDP协议编程: 

              UDP发送端(理解或者掌握)

                     A:创建发送端Socket服务对象

                     B:创建数据,并把数据打包

                     C:发送数据

                     D:释放资源 

              UDP协议接收数据步骤:

                     A:创建接收端Socket服务对象

                     B:创建数据包(接收容器)

                     C:调用接收方法

                     D:解析数据包,把数据显示在控制台

                     E:释放资源 

              UDP协议发送数据和接收数据的代码改进 

              UDP协议键盘录入数据发送到接收端 

              广播地址

                     每个网段的255的IP就是广播地址

                     比如: 192.168.1.255

                     只要发送端发送的192.168.1.255,如果192.168.1.*都开了接收端,就都能接收到数据

              UDP编程结合线程模拟聊天室

                     开两个线程一个线程写接收端 一个线程写发送端

       面向TCP协议编程: 

              TCP协议客户端的步骤:

                A:创建客户端的Socket对象

                B:建立连接

                C:获取输出流,写数据即可

                D:释放资源 

              TCP协议服务器端的步骤:

                A:创建服务器端Socket对象

                B:监听连接

                C:获取输入流,读取数据,并显示

                D:释放资源 

              TCP服务器端和客户端相互发送数据 

              案例:写出一个服务器,要求该服务器具有将客户端发过来的英文字母转大写的功能 ,

                     并将转大写后的字母发送回客户端

//发送端
packagecn.itcast_08; 
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.Socket;
 
/*
 * 需求:数据来源于键盘录入与,通过服务器转成大写,然后反馈给客户端显示。
 */
public classClientDemo {
       public static void main(String[] args)throws IOException {
              //创建客户端Socket对象
              Sockets = new Socket("192.168.3.100", 22222);
 
              //封装键盘录入
              BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
              //获取输出流
              //OutputStream os = s.getOutputStream();
              BufferedWriterbw = new BufferedWriter(new OutputStreamWriter(
                            s.getOutputStream()));
 
              Stringline = null;
              while((line = br.readLine()) != null) {
                     if ("over".equals(line)) {
                            break;
                     }
 
                     bw.write(line);
                     bw.newLine();
                     bw.flush();
 
                     // 获取服务器的反馈
                     BufferedReader brServer = newBufferedReader(new InputStreamReader(
                                   s.getInputStream()));
                     String server = brServer.readLine();
                     System.out.println("server:" +server);
              }
 
              br.close();
              s.close();
       }
}
//接收端
packagecn.itcast_08;
 
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
import java.net.ServerSocket;
importjava.net.Socket;
 
public classServerDemo { 
       public static void main(String[] args)throws IOException {
              //创建服务器Socket对象
              ServerSocketss = new ServerSocket(22222);
 
              //监听客户端
              Sockets = ss.accept();
 
              //获取输入流
              BufferedReaderbr = new BufferedReader(new InputStreamReader(
                            s.getInputStream()));
              BufferedWriterbw = new BufferedWriter(new OutputStreamWriter(
                            s.getOutputStream()));
 
              Stringline = null;
              while((line = br.readLine()) != null) {
                     bw.write(line.toUpperCase());
                     bw.newLine();
                     bw.flush();
              }
 
              s.close();
              //ss.close();
       }
}

二、设计模式

设计模式:

       设计模式是一种思想(不是技术,技术是像IO 反射 集合这样的),是一种帮助开发人员完成某些代码上的逻辑,

              使代码的逻辑更严谨,是代码更加简洁,美观。(设计模式并没有提高代码的运行效率和速度,

              如果想要更多的去了解如何提高程序的运行速度的思想,请去了解数据结构的思想

              数据结构的思想:拿空间换时间拿时间换空间)

              通常项目比较庞大的情况下才能体现出设计模式的好处 

       创建型:创建对象。工厂模式,单例模式。

       结构型:对象间的关系。装饰模式。

       行为型:对象能够做什么。模板模式。 

       1、工厂模式:当我们想要获取某个对象的时候,想在获取对象之前做一些初始化的动作就用到了工厂模式          

           简单工厂模式举例:        

    public abstract class Animal {
                     publicabstract void eat();
              }             
              public class AnimalFactory {
                     privateAnimalFactory() {
                     }
                     publicstatic Animal createAnimal(String type) {
                            if ("dog".equals(type)) {
                                   returnnew Dog();
                            } else if ("cat".equals(type)){
                                   returnnew Cat();
                            } else {
                                   returnnull;
                            }
                     }
              }
              public static void main(String[] args) {
             
                     Animala = AnimalFactory.createAnimal("dog");
                     a.eat();
                    
                     a= AnimalFactory.createAnimal("cat");
                     a.eat();
              }
 
              public class Cat extends Animal {
                     @Override
                     publicvoid eat() {
                            System.out.println("猫吃老鼠");
                     }
              }
 
              public class Dog extends Animal {
                     @Override
                     publicvoid eat() {
                            System.out.println("狗吃骨头");
                     }
              }
 

          工厂方法模式举例:

              

public abstract class Animal {
                     publicabstract void eat();
              }
 
              public abstract class AnimalFactory {
                     publicabstract Animal createAnimal();
              }
              public class Cat extends Animal {
                     @Override
                     publicvoid eat() {
                            System.out.println("猫吃老鼠");
                     }
              }
              public class CatFactory extendsAnimalFactory {
                     @Override
                     publicAnimal createAnimal() {
                            return new Cat();
                     }
              }
              public class Dog extends Animal {
                     @Override
                     publicvoid eat() {
                            System.out.println("狗吃骨头");
                     }
              }
              public class DogFactory extendsAnimalFactory {
                     @Override
                     publicAnimal createAnimal() {
                            return new Dog();
                     }
              }
              public class Pig extends Animal {
                     @Override
                     publicvoid eat() {
                            System.out.println("猪吃饲料");
                     }
              }
              public class PigFactory extendsAnimalFactory {
                     @Override
                     publicAnimal createAnimal() {
                            return new Pig();
                     }
              }
              public class AnimalTest {
                     publicstatic void main(String[] args) {
                            // 使用狗工厂
                            AnimalFactory af = new DogFactory();
                            Animal a = af.createAnimal();
                            a.eat();
 
                            af = new CatFactory();
                            a = af.createAnimal();
                            a.eat();
 
                            af = new PigFactory();
                            a = af.createAnimal();
                            a.eat();
                     }
              }
        

2、单例设计模式:当我们想要在所有程序运行状态中,所用的一个类的对象,都是同一个对象的时候就用单例模式          

           单例饿汉式举例:

            

  public class Student {
                     //把构造方法私有,是为了不让外界随意创建
                     privateStudent() {
                     }
                     //类本身要创建一个对象。
                     //由于静态只能访问静态,所以这里加静态
                     //为了不让外界通过类名直接访问s成员变量,就加私有
                     privatestatic Student s = new Student();
 
                     //提供公共的方式让别人使用
                     //为了让外界能够直接通过类名访问该方法,需要对该方法加静态
                     publicstatic Student getStudent() {
                            // return new Student(); //这是有问题的
                            return s;
                     }
              } 

           单例懒汉式举例:

             

 public class Teacher {
 
                     privateTeacher() {
                     }
                     privatestatic Teacher t = null;
                     publicsynchronized static Teacher getTeacher() {
                            // t1,t2,t3三个线程过来了
                            // 如果t是null的时候,才创建对象
                            if (t == null) {
                                   //t1进来了,CPU的执行权就被t2抢到了,同理t3
                                   t= new Teacher();
                            }
                            return t;
                     }
              } 

       模板设计模式:当我们执行的某些程序时发现执行的所有的程序 外面的框框都不会变,只需要改变同样地方的一些东西的时候,就可以使用模板模式      

            

  public class PrintDemo1 extendsPrintTemplet {
                     @Override
                     publicvoid printHead() {
                            System.out.println("采用第一种方案打印头");
                     }
                     @Override
                     publicvoid printBody() {
                            System.out.println("采用第一种方案打印中间");
                     }
                     @Override
                     publicvoid printBottom() {
                            System.out.println("采用第一种方案打印尾");
                     }
              }
 
              public class PrintDemo2 extendsPrintTemplet {
                     @Override
                     publicvoid printHead() {
                            System.out.println("采用第二种方案打印头");
                     }
                     @Override
                     publicvoid printBody() {
                            System.out.println("采用第二种方案打印中间");
                     }
                     @Override
                     publicvoid printBottom() {
                            System.out.println("采用第二种方案打印尾");
                     }
              }
              public abstract class PrintTemplet {
                     publicvoid print() {
                            printHead();
                            printBody();
                            printBottom();
                     }
                     publicabstract void printHead();
                     publicabstract void printBody();
                     publicabstract void printBottom();
              }
              public class PrintTest {
                     publicstatic void main(String[] args) {
                            PrintTemplet pt = new PrintDemo1();
                            pt.print();
                            System.out.println("------------");
                            pt = new PrintDemo2();
                            pt.print();
                     }
              }
 

3、装饰者模式:当我们觉得某个类的内容需要拓展一些功能的时候,我们会首先想到继承,确实继承可以解决在原来的基础上拓展功能

                     但是当子类想用原来的功能,就必须要用父类来实现,但是如果某一天父类功能改变了,我还想让子类有同样的功能和拓展功能,

                     这样是不能实现的。

                     所以我们有了装饰者设计模式,建一个装饰类,把被装饰的类作为构造方法的参数传进来,就可以实现功能的拓展,

                     这就是装饰者模式 

           装饰者模式举例:

            

  public interface Phone {
                     publicabstract void call();
              }
              public class PhoneImpl implements Phone {
              @Override
                     publicvoid call() {
                            System.out.println("用手机打电话");
                     }
              }
              public abstract class PhoneDecorateimplements Phone {
                     privatePhone phone;
                     publicPhoneDecorate(Phone phone) {
                            this.phone = phone;
                     }
                     @Override
                     publicvoid call() {
                            this.phone.call();
                     }
              }
 
              public class GuangGaoPhoneDecorateextends PhoneDecorate {
                     publicGuangGaoPhoneDecorate(Phone phone) {
                            super(phone);
                     }
                     @Override
                     publicvoid call() {
                            super.call();
                            System.out.println("播放广告");
                     }
              }
 
              public class ColorPhoneDecorate extendsPhoneDecorate {
                     publicColorPhoneDecorate(Phone phone) {
                            super(phone);
                     }
                     @Override
                     publicvoid call() {
                            System.out.println("播放彩铃");
                            super.call();
                     }
              }
              public class PhoneTest {
                     publicstatic void main(String[] args) {
                            Phone p = new PhoneImpl();
                            p.call();
                            System.out.println("---------------");
 
                            PhoneDecorate pd = newColorPhoneDecorate(p);
                            pd.call();
                            System.out.println("---------------");
 
                            pd = new GuangGaoPhoneDecorate(p);
                            pd.call();
                            System.out.println("---------------");
 
                            ColorPhoneDecorate cc =newColorPhoneDecorate(p);
                            pd = new GuangGaoPhoneDecorate(cc);
                            pd.call();
                     }
              }
             
 

              

你可能感兴趣的:(黑马程序员——网络编程与设计模式)