一、网络编程:
1、掌握内容:
A、UDP编程的步骤
接收端:
package liuxiaofan;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(12345) ;
//创建接收容器
//创建字节数组的大小1024或者1024的倍数
byte[] bys = new byte[1024] ;
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//调用接收的方法
ds.receive(dp);//阻塞式方法
//解析数据,将数据展示在控制台
//获取ip地址
String ip = dp.getAddress().getHostAddress() ;
//public byte[] getData() 获取缓冲区中实际的字节数
//public int getLength() 获取缓冲区中实际的长度
String s = new String(dp.getData(), 0,dp.getLength()) ;
//展示控制台
System.out.println("from"+ip+"data is:"+s);
//释放资源
ds.close();
}
}
发送端:
package liuxiaofan;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
*将UDP编程的发送端和接收端优化!
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象
DatagramSocket ds = new DatagramSocket() ;
//创建数据报包对象
byte[] bys = "hello,udp,我来了".getBytes() ;
DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.10.1"),12345) ;
//发送数据
ds.send(dp);
//释放资源
ds.close();
}
}
B、TCP的发送端和接收端的开发步骤
客户端client
package liuxiaofan;
import java.io.OutputStream;
import java.net.Socket;
/**
*TCP(建立连接通道)编程的客户端的开发步骤
*1)创建客户端的Socket对象
* Socket:就是客户端的Socket
* 构造方法
* public Socket(InetAddress address, int port)
* public Socket(String host, int port):创建客户端套接字对象,并且指定端口号和ip文本形式
*2)获取通道内的输出流对象
*3)给服务器端写数据
*4)释放资源
*java.net.ConnectException: Connection refused: connect 连接被拒绝
*不要先运行客户端,客户端的连接需要服务器监听到才能连接
*/
public class ClientDemo {
public static void main(String[] args) throws Exception {
//1)创建客户端的Socket对象
//public Socket(String host, int port)
Socket s = new Socket("192.168.10.1", 12306) ;
//2)获取通道内的输出流对象
// public OutputStream getOutputStream():获取套接字 的输出流
OutputStream out = s.getOutputStream() ;
//3)给服务器端写数据 过去
out.write("hello,Tcp,我来了".getBytes());
//释放资源
s.close();
}
}
服务器server
package liuxiaofan;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
*服务端的开发步骤:
* 1)创建服务器端的Socket对象
* 2)监听客户端的连接(阻塞方法)
* 3)获取通道内的输入流
* 4)读取数据,显示控制台
* 5)释放资源
*ava.net.BindException: Address already in use: JVM_Bind 地址被绑定,因为已经有服务器在监听客户端连接
*/
public class ServerDemo {
public static void main(String[] args) throws Exception {
//1)创建服务器端的Socket对象
// public ServerSocket(int port) throws IOException创建绑定到特定端口的服务器套接字
ServerSocket ss = new ServerSocket(12306) ;
//2)监听客户端的连接(阻塞方法)
//public Socket accept(): throws IOException侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞
//Socket s = ss.accept() ;
3)获取通道内的输入流
//InputStream getInputStream()
InputStream in = s.getInputStream() ;
//4)读取数据,显示控制台
//获取ip文本形式'
//public InetAddress getInetAddress()
String ip = s.getInetAddress().getHostAddress() ;
byte[] bys = new byte[1024] ;
int len = in.read(bys) ;
String data = new String(bys, 0, len) ;
System.out.println("from" +ip +"data is :"+data);
//5)释放资源
s.close();
//ss.close(); 服务端可以不关闭
}
}
C、如何利用多线程运用网络编程!
D、TCP和UPD的区别?
二、反射(重点)
通过包名.类名方式获取该类对应的字节码文件对象/类对象:
1、反射的概念:
反射就是通过获取class字节码文件对象/Class的类对象,
获取该字节码文件对象中的成员变量,构造方法,和成员方法
2、Field: 简称成员变量 (Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
反射的字段可能是一个类(静态)字段或实例字段。)
Constructor:简称构造方法:提供关于类的单个构造方法的信息以及对它的访问权限。
Method:简称成员方法:类或接口上单独某个方法(以及如何访问该方法)的信息
面试题:
如何获取class字节码文件对象/Class的类对象
三种方式来获取这个class字节码文件对象:
1)Object中的getClass()
2)任何数据类型的静态属性class
3)Class类中的方法:
forName(String className)
开发中使用第三种方式,forName方法中的参数是一个String类型,以后可以用字符串类型数据作为配置文件!
3、通过字节码文件对象获取构造方法并使用.
通过反射获取构造方法并使用
通过反射获取成员变量,并使用
三、动态代理
代理: 在程序的执行过程中,通过一个类Proxy和接口invacationHandler(处理程序)实现动态代理。
Proxy类中的方法创建动态代理类对象:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 最终会调用 InvocationHandler的方法--->InvocationHandler Object invoke(Object proxy,Method method,Object[] args)
参数1:loader:类加载器 public ClassLoader getClassLoader() 参数2:public Class<?>[]
getInterfaces()
四、枚举enum