文章目录
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这个关键字