Java网络编程与反射
目录
一、网络编程
1、概述
2、IP
3、端口
4、协议
(1)UDP协议
(2)TCP协议
5、三次握手四次挥手
二、反射
一、网络编程
1、概述
在网络通信协议下,不同计算机上运行的程序可以进行数据传输。
网络编程三要素:IP、端口号、协议
2、IP
IP全称Internet Protocol,是互联网协议地址,也称IP地址。
IP地址是网络中设备的唯一标识。
特殊IP地址:127.0.0.1或localhost,是回送地址,可以代表本机地址,一般用来测试使用,永远只会寻找当前所在本机。
方法名 | 说明 |
---|---|
static InetAddress getByName(String host) | 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 |
String getHostName() | 获取此IP地址的主机名 |
String getHostAddress() | 返回文本显示中的IP地址字符串 |
3、端口
端口是设备上应用程序的唯一标识。
端口号是由两个字节表示的整数,取值范围为0-65535。0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
4、协议
计算机网络中,连接和通信的规则成为网络通信协议。
分为UDP协议和TCP协议
(1)UDP协议
发送数据
构造方法
方法名 | 说明 |
---|---|
DatagramSocket() | 创建数据报套接字并将其绑定到本机地址上的任何可用端口 |
DatagramPacket(byte[] buf,int len,InetAddress add,int port) | 创建数据包,发送长度为len的数据包到指定主机的指定端口 |
方法
方法名 | 说明 |
---|---|
void send(DatagramPacket p) | 发送数据报包 |
void close() | 关闭数据报套接字 |
void receive(DatagramPacket p) | 从此套接字接受数据报包 |
发送数据的步骤:
1、创建发送端的Socket对象(DatagramSocket)
2、创建数据,并把数据打包
3、调用DatagramSocket对象的方法发送数据
4、关闭发送端
接收数据
构造方法
方法名 | 说明 |
---|---|
DatagramPacket(byte[] buf, int len) | 创建一个DatagramPacket用于接收长度为len的数据包 |
方法
方法名 | 说明 |
---|---|
byte[] getData() | 返回数据缓冲区 |
int getLength() | 返回要发送的数据的长度或接收的数据的长度 |
UDP有三种通信方式,分别为单播,组播,广播。
单播用于两个主机之间的端对端通信,组播用于对一组特定主机的通信,广播用于一个主机对整个局域网上所有主机的数据通信。
组播实现步骤:
发送端
1. 创建发送端的Socket对象(DatagramSocket)
2. 创建数据,并把数据打包(DatagramPacket)
3. 调用DatagramSocket对象的方法发送数据
4. 释放资源
接收端
1. 创建接收端Socket对象(MulticastSocket)
2. 创建一个箱子,用于接收数据
3. 把当前计算机绑定一个组播地址
4. 将数据接收到箱子中
5. 解析数据包,并打印数据
6. 释放资源
广播实现步骤
发送端
1. 创建发送端Socket对象(DatagramSocket)
2. 创建存储数据的箱子,将广播地址封装进去
3. 发送数据
4. 释放资源
接收端
1. 创建接收端的Socket对象(DatagramSocket)
2. 创建一个数据包,用于接收数据
3. 调用DatagramSocket对象的方法接收数据
4. 解析数据包,并把数据在控制台显示
5. 关闭接收端
(2)TCP协议
发送数据
构造方法
方法名 | 说明 |
---|---|
Socket(InetAddress address,int port) | 创建流套接字并将其连接到指定IP指定端口号 |
Socket(String host, int port) | 创建流套接字并将其连接到指定主机上的指定端口号 |
方法
方法名 | 说明 |
---|---|
InputStream getInputStream() | 返回此套接字的输入流 |
OutputStream getOutputStream() | 返回此套接字的输出流 |
接收数据
构造方法
方法名 | 说明 |
---|---|
ServletSocket(int port) | 创建绑定到指定端口的服务器套接字 |
方法
方法名 | 说明 |
---|---|
Socket accept() | 监听要连接到此的套接字并接受它 |
相关注意点:
-
accept方法是阻塞的,作用就是等待客户端连接
-
客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
-
针对客户端来讲,是往外写的,所以是输出流 针对服务器来讲,是往里读的,所以是输入流
-
read方法也是阻塞的
-
客户端在关流的时候,还多了一个往服务器写结束标记的动作
-
最后一步断开连接,通过四次挥手协议保证连接终
如果“aaa”改成中文,接收时会变成乱码。解决方法:不使用字节流,而改用字符流。
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()))
5、三次握手四次挥手
二、反射
反射允许对成员变量,成员方法和构造方法的信息进行编程访问。
利用反射创建的对象可以无视修饰符调用类里面的内容。
获取class对象:
//1.Class这个类里面的静态方法forName
//Class.forName("类的全类名"): 全类名 = 包名 + 类名
Class clazz1 = Class.forName("com.itheima.reflectdemo.Student");
//源代码阶段获取 --- 先把Student加载到内存中,再获取字节码文件的对象
//clazz 就表示Student这个类的字节码文件对象。
//就是当Student.class这个文件加载到内存之后,产生的字节码文件对象//2.通过class属性获取
//类名.class
Class clazz2 = Student.class;//因为class文件在硬盘中是唯一的,所以,当这个文件加载到内存之后产生的对象也是唯一的
System.out.println(clazz1 == clazz2);//true//3.通过Student对象获取字节码文件对象
Student s = new Student();
Class clazz3 = s.getClass();
System.out.println(clazz1 == clazz2);//true
System.out.println(clazz2 == clazz3);//true