欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络编程/TCP编程/UDP编程/反射/动态代理/枚举

程序员文章站 2024-03-23 14:37:34
...

一、网络编程:

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、TCPUPD的区别


二、反射(重点)

通过包名.类名方式获取该类对应的字节码文件对象/类对象:

1、反射的概念:
  反射就是通过获取class字节码文件对象/Class的类对象,
  获取该字节码文件对象中的成员变量,构造方法,和成员方法
 
 2、Field: 简称成员变量 (Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
           反射的字段可能是一个类(静态)字段或实例字段。)
    Constructor:简称构造方法:提供关于类的单个构造方法的信息以及对它的访问权限。
    Method:简称成员方法:类或接口上单独某个方法(以及如何访问该方法)的信息
 
 面试题:                 
   如何获取class字节码文件对象/Class的类对象
   三种方式来获取这个class字节码文件对象:
   1)Object中的getClass()
   2)任何数据类型的静态属性class  
   3)Class类中的方法:
     forName(String className)

     forName("类路径") 

开发中使用第三种方式,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