文章目录
1 网络编程
网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分
并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。
IP
IP组成:
●IP地址
唯一标识网络中的每一台计算机
●IP地址的组成
32位,由4个8位二进制数组成
端口
●计算机上不同的应用程序通过不同的端口(port)来与其它计算机通信
●端口范围0-65535
●系统保留端口0-1023,保留一位1024
1.1 套接字(socket)
■通信链路的端点就被称为"套接字”( 英文名Socket )
■是提供给应用程序的接口
●是Internet通信的端点
●与主机地址和端口地址相关联
●客户端和服务器通过套接字建立连接和进行通信
套接字 = IP 地址 + 端口
java中使用Socket类 来封装套接字信息
Socket的底层机制复杂,Jaya平台提供了一些简单的API,可以
更简单有效的使用Socket开发 而无需了解底层机制。
1.2 OSI模型
TCP
●Transfer Control Protocal传输控制协议
●面向端对端 连接的安全可靠性传输协议
●确认两端建立可靠连接后才开始通信
●为了确保可靠性,丧失了部分性能
●三次握手
●与打电话相似
1.3 套接字编程
应用案例见后面 1.5客户端服务器案例。
1.4 UDP编程
需要socket支撑
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ServerUDP {
public static void main(String[] args) throws IOException {
// 通信套接字
DatagramSocket datagramSocket = new DatagramSocket(8989);
// 读取的内容
byte[] arr = new byte[1024];
// 创建数据包
DatagramPacket datagramPacket = new DatagramPacket(arr, arr.length);
// 装入数据 把数据放入数组中
datagramSocket.receive(datagramPacket);
System.out.println(new String(arr).trim() + "--------------");
datagramSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ClientUDP {
public static void main(String[] args) throws IOException {
// 创建 InetAddress
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
// java.net.BindException: Address already in use: Cannot bind 端口被占用
// 套接字
DatagramSocket datagramSocket = new DatagramSocket(8888, inetAddress);
byte[] arr = "你好,我是XXXX".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(arr, arr.length, inetAddress, 8989);
// 发送
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
TCP,UDP区别
参考文档:https://blog.csdn.net/li_ning_/article/details/52117463
https://blog.csdn.net/WHB20081815/article/details/67640804
1.5 服务器,客户端通信
服务器和客户端共同承担计算
●客户端:向另一台计算机请求服务的计算机
●服务器:处理客户端请求的计算机
客户端,服务端应答/响应 案例 看我另外的博客:
https://blog.csdn.net/weixin_45044097/article/details/98883921
1.6 通过Java给qq邮箱发送邮件
点击这个自行查看:
https://blog.csdn.net/weixin_45044097/article/details/98884684
2 反射(基础)
2.1 方法
- 反射 探索未知的类
- 泛型
把类变成Class类型 —— 类名.class
方法 | 属性 |
---|---|
Class.forName(path) | 查找此路径下是否存在指定类 |
getConstructors() | 查看所有公共构造器 |
getDeclaredConstructors() | 查看所有构造器 |
getDeclaredMethods() | 查看所有方法 |
getDeclaredFields() | 查看所有属性 |
getDeclaredConstructors(String.class…) | 查看具体的构造器 |
getDeclaredMethod(name, paraterTypes) | 查看指定方法 |
Constructor | 方法 |
---|---|
getModifiers() | 获取构造器修饰符 |
getParameters() | 获取参数数组 |
Method | 方法 |
---|---|
getReturnType() | 获取方法返回值类型 |
setAccesible(ture) | 检查访问修饰符 |
Field | 方法 |
---|---|
getName() | 属性名 |
getType() | 属性类型 |
2.2 编程
public class Student {
private String name; //private Double name;
protected Integer age;
Character sex;
public Boolean isSingle;
// 测试四个构造函数
public Student() {System.out.println("----调用----"); }
Student(String name) {
super();
System.out.println("String-----" + name);
this.name = name;
}
protected Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
private Student(String name, Integer age, Character sex, Boolean isSingle) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.isSingle = isSingle;
}
// getter,setter方法...
public void testPublic(String name, Integer age) {
System.out.println("public name=" + name + ";age=" + age);
}
private void testPrivate(String name) {
System.out.println("private name=" + name);
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class TestClass {
public static void main(String[] args)
throws ClassNotFoundException, NoSuchMethodException, SecurityException, NoSuchFieldException {
// 传入类的路径
String path = "day10.Student";
// 查找
Class cl = Class.forName(path);// ClassNotFoundException
// 查看这个类的 构造器 方法 属性
// 查看所有公共的构造器
Constructor[] carr = cl.getConstructors();
System.out.println(carr.length);
// 获得所有的构造器
carr = cl.getDeclaredConstructors();
System.out.println(carr.length);
// 查看每个构造器的信息
for (Constructor constructor : carr) {
System.out.println("构造器完整信息:" + constructor);
// 获得修饰符
System.out.println("构造器修饰符" + constructor.getModifiers());
// 获得参数列表
Parameter[] parameters = constructor.getParameters();
for (Parameter parameter : parameters) {
System.out.print(parameter + "\t");
}
System.out.println();
}
// 方法
Method[] methods = cl.getDeclaredMethods();
System.out.println(methods[0].toString());
System.out.println(methods[0].getReturnType());
// 属性
Field[] fields = cl.getDeclaredFields();
// 属性 类型 修饰符
System.out.println(fields[0].getName());
System.out.println(fields[0].getType());
// 怎么把类变成Class类型 >>> 类名.class
// 获得指定的构造器
Constructor constructor = cl.getDeclaredConstructor(String.class);
// constructor=cl.getDeclaredConstructor(String.class,Integer.class,Boolean.class,Character.class);
System.out.println(constructor.getModifiers()); // 0
}
}
运行结果:
实例化类对象 多种方式:
- newInstance:调用公共无参数构造器
- Constructor
testPrivate.setAccessible(true);打破访问规则,检查访问修饰符
// Student为上例中的
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws Exception {
// 类对象
Class<Student> cl = Student.class;
// 实例化对象
Student obj = cl.newInstance();// 调用公共无参数构造器
System.out.println(obj);
obj.age = 18;
// 创建对象
Constructor<Student> constructor = cl.getDeclaredConstructor(String.class);
// 实例化对象
Student stu = constructor.newInstance("韩梅梅");
Method testPublic = cl.getMethod("testPublic", String.class, Integer.class);
// 方法:那个对象调用这个方法,参数值 对象.方法()
testPublic.invoke(stu, "韩梅梅", 18);
Method testPrivate = cl.getDeclaredMethod("testPrivate", String.class);
// 打破访问规则 不要检查访问修饰符
testPrivate.setAccessible(true);
testPrivate.invoke(stu, "李磊");
}
}
运行结果:
2.3 反射+XML+泛型案例
点击链接查看:
https://blog.csdn.net/weixin_45044097/article/details/99099404