网络编程与反射

1. 网络编程

1.1 认识网络编程

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

java . net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。

1. 2 什么是 ip

  • 所谓的IP其实就是计算机的地址,相当于是人的身份证;如 :我们在浏览器上访问谷歌百度就是 用 ip+端口号

  • IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。

  • 如果是 IPV4 协议的话,构成是4位的,例如:10.2.26.13,最多能有 42 亿多的 ip 地址,每个位置上的数字:【0,255】,但是边界值不要用。

  • 全国70多亿人,为什么 IP 够用 ?

    ​ 因为有一种技术叫做 DHCP,动态获取ip技术

  • 本机的ip : 127.0.0.1 或 localhost

1. 3 端口

  • 端口:是计算机出厂的时候,预留的进行内部处理与外部交互的一个“门”,他的取值是0-65536之间,0-1024之间是特权端口:
  • 特殊含义的端口:
    • 80 : 通常HTTP通讯。
    • 21 : 用于连接。
    • 20 :用于传输数据。
    • 8080 :tomcat 服务器
    • 3306: 数据库

1.4 协议

  • 协议:起到一个规范和约束(数据的传输的格式)的作用的一个东西,在计算机中有许多的协议,
  • 常见的协议:
    • HTTP/HTTPS : 超文本传输协议, 例如:浏览器请求
    • FTP: 文本传输协议
    • TCP/IP :IP协议 规定了你的IP是怎样的
    • POP3:邮件发送协议
    • XX:自定义协议

1.5 媒介和载体

  • 媒介和载体:
    • 网络
      • 网线:普通的双绞线(8根)
      • 交换机:进行信息交换的一个工具,但是不能自动拨号
      • 路由器:能够实现自动拨号的一个工具,wifi:
      • 网卡:是计算机中一个硬件,其主要作用是将数据通过它传递出去,笔记本中一般是两块网卡,其分别为有线网卡和无线网卡

网线:普通的双绞线( 8根细线构成的)<<绝缘双绞线

1.6 网络七层

  • OSI 模型:物 数 网 传 会 表 应
  • 我们的 JAVAEE 开发的软件都是应用层的软件

1.7 在java中使用网络编程

实现在同一局域网下的通信 (单线程)

服务端

package cn.guoke.rwd;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;



public class Test_01 {
	public static void main(String[] args) throws Exception{
		int port = 8080;
		ServerSocket  server=new ServerSocket(port);
		System.out.println("---------等待连接--------- ");
		Socket serverSocket = server.accept();
		System.out.println("连接成功");

		OutputStream outPutStream = serverSocket.getOutputStream();// 将数据转换为输出流
        // 将服务端的输入的数据发送到客户端
        PrintStream printStream =null;
        InputStream inputStream =null;
        InputStreamReader inputStreamReader =null;
        BufferedReader reader=null;
        String getInfo =null;
        while(true) {
            System.out.print("前桑:");
            Scanner cin = new Scanner(System.in);
            String sendInfo = cin.nextLine();
            printStream= new PrintStream(outPutStream);// 获取一个输出对象
            printStream.println(sendInfo);
            // 从服务端读取消息
            inputStream = serverSocket.getInputStream();
            inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
            reader = new BufferedReader(inputStreamReader);
            getInfo = reader.readLine();
            System.out.println("成桑:"+getInfo);
        }
				
	}

}

客户端

package cn.guoke.rwd;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;



public class Test_02 {
	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket   socket=new Socket("localhost", 8080);
		System.out.print("连接成功");	
		OutputStream outPutStream = socket.getOutputStream();// 将数据转换为输出流
		// 将服务端的输入的数据发送到客户端
		PrintStream printStream =null;
		InputStream inputStream =null;
		InputStreamReader inputStreamReader =null;
		BufferedReader reader=null;
		String getInfo =null;
		while(true) {
			System.out.print("成桑:");
			Scanner cin = new Scanner(System.in);
			String sendInfo = cin.nextLine();
			printStream= new PrintStream(outPutStream);// 获取一个输出对象
			printStream.println(sendInfo);
			// 从服务端读取消息
			 inputStream = socket.getInputStream();
			 inputStreamReader = new InputStreamReader(inputStream);
			 reader = new BufferedReader(inputStreamReader);
			getInfo = reader.readLine();
			System.out.println("前桑:"+getInfo);
		}
	}

}

2. 反射

2.1 什么是反射

  • 反射: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制 (帮助理解:就是我们可以通过代码获取到类中的所有属性和所有方法 ,简而言之:自己找到自己,俗称“照镜子”)

2.2 获取对象的三种方式

首先定义一个Student

package cn.guokeA;

public class Student {
   	public Integer id;
    public  String name;
    public  Integer age;

    public Student(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Student() {
        System.out.println("无参构造器!!");
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    
    public void say(){
        if (name.matches("[a-zA-Z]")) System.out.println("Hi");
        System.out.println("你好!");
    }
    
    
    
}

第一种 通过 getClass() 方法

public static void main(String[] args) {
    Student student = new Student();
    //通过getClass()方法
    Class<? extends Student> aClass = student.getClass();
    System.out.println(aClass);
}

执行结果:
    无参构造器!!
	class cn.guokeA.Student

第二种 通过 class 属性

    public static void main(String[] args) {
        Student student = new Student();
        //通过class属性
        Class<Student> studentClass = Student.class;
        System.out.println(studentClass);
    }
执行结果:
    class cn.guokeA.Student

第三种 通过 Class . forName

    public static void main(String[] args) throws ClassNotFoundException {
        //方式三:通过Class.forName
        System.out.println(Class.forName("cn.guokeA.Student"));
    }

2.3 通过反射获取到类对象中的属性和方法

获取类路径的属性和方法

 public static void main(String[] args) throws ClassNotFoundException {
        Student student = new Student();
        //通过getClass()方法
        Class<? extends Student> aClass = student.getClass();

        //获取类的简称和全称
        System.out.println("类路径的简写 :"+aClass.getSimpleName());
        System.out.println("类路径的全写 :"+aClass.getName());

        //获取类中的属性
        Field[] fields = aClass.getFields();
        for (Field field : fields) {
            System.out.println("类属性的名字:"+field.getName()+"类属性的类型: "+field.getType());
        }

        //获取类中的方法
        Method[] methods = aClass.getMethods();
        for (Method everyMethod : methods)
        {
            System.out.println("类中方法的名字:"+everyMethod.getName()+"类中方法的返回值类型"+everyMethod.getReturnType());
        }

    }
    
执行结果:
    无参构造器!!
    类路径的简写 :Student
    类路径的全写 :cn.guokeA.Student
    类属性的名字:id类属性的类型: class java.lang.Integer
    类属性的名字:name类属性的类型: class java.lang.String
    类属性的名字:age类属性的类型: class java.lang.Integer
    类中方法的名字:toString类中方法的返回值类型class java.lang.String
    类中方法的名字:getName类中方法的返回值类型class java.lang.String
    类中方法的名字:getId类中方法的返回值类型class java.lang.Integer
    类中方法的名字:setName类中方法的返回值类型void
    类中方法的名字:setId类中方法的返回值类型void
    类中方法的名字:setAge类中方法的返回值类型void
    类中方法的名字:say类中方法的返回值类型void
    类中方法的名字:getAge类中方法的返回值类型class java.lang.Integer
    类中方法的名字:wait类中方法的返回值类型void
    类中方法的名字:wait类中方法的返回值类型void
    类中方法的名字:wait类中方法的返回值类型void
    类中方法的名字:equals类中方法的返回值类型boolean
    类中方法的名字:hashCode类中方法的返回值类型int
    类中方法的名字:getClass类中方法的返回值类型class java.lang.Class
    类中方法的名字:notify类中方法的返回值类型void
    类中方法的名字:notifyAll类中方法的返回值类型void



反射获取构造器

public static void main(String[] args) throws Exception {
   
		       Class<?> student = Class.forName("com.rj.bd.reflects.Student");
		      
		       //获取所有公有构造方法(器)
		      Constructor<?>[ ] constructorArrays = student.getConstructors();
		      for (Constructor<?> constructor : constructorArrays)
		      {
				  System.out.print(constructor);
			      Class<?>[ ] parameterTypes = constructor.getParameterTypes();
		      
			         for (Class<?>  parameter : parameterTypes)
			            {
							System.out.print("\t:"+parameter.getName());
						}
                   System.out.println();			      
		      }
		
	}

补充 :因为反射可以获取构造器,所以他可以实例化对象。

2.4 反射读取配置文件

创建配置文件

url =jdbc:mysql://localhost:3306/hello?serverTimezone=UTC
user = root 
possword=990801lxq
driver = com.mysql.cj.jdbc.Driver

读取配置文件

public static void main(String[] args) throws Exception {

		//1.将配置文件中的内容读入到Properties
		Properties  properties=new Properties();
		FileReader fileReader=new FileReader("jdbc.properties");
		properties.load(fileReader);//将文件读取到properties中
		
		//2.利用properties获取配置文件中的内容
		String url = properties.getProperty("url");
		System.out.println(url);
		String user = properties.getProperty("user");
		System.out.println(user);
		String possword = properties.getProperty("possword");
		System.out.println(possword);
		String driver = properties.getProperty("user");
		System.out.println(driver);
		
		
	}

2.5 反射的作用

  • 反射的作用:

    • 可以在任何地方获取到类中的属性和方法和构造器
    • 因为可以获取到构造器,当然也可以实例化类(通过调用newInstance( )方法即可实现)
    • 经常被应用在框架中,例如Struts2框架,Spring框架

    newInstance( )这个方法勉强等同于new这个关键字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值