网络编程(Socket)
一、Java网络编程
网络编程是指编写运行在多个设备的计算机程序,这些设备都通过网络来连接。
Java.net包中提供了两种常见的网络协议的支持:
TCP:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP位于IP之上,应用层之下的中间层。
UDP:UDP位于OSI模型的传输层,一个无连接的协议。
1.Socket编程
套接字使用TCP提供了两台计算机之间的通信机制。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
(1)、服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
(2)、服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
(3)、服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
(4)、Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
(5)、在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
2.Socket整体流程
Socket编程主要涉及到客户端和服务端,先是服务端创建一个服务器套接字(ServerSocket),并附加到一个端口上,服务器从端口监听连接。
3、ServerSocket类的方法
ServerSocket类的四个构造方法:
public ServerSocket(int port) throws IOExceeption :创建绑定到特定端口的服务器套接字。
public ServerSocket(int port,int backlog) throws IOException:利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。
public ServerSocket(int port, int backlog, InetAddress address) throws IOException:使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。
public ServerSocket() throws IOException:创建非绑定服务器套接字。
ServerSocket类的常用方法:
(1)、public int getLocalProt():返回此套接字在其上侦听的端口。
(2)、public Socket accept() throws IOException:侦听并接受到此套接字的连接
(3)、public void setSoTimeout(int timeout):通过指定超时值启用或者禁用SO_TIMEOUT,以毫秒值为单位。
(4)、public void bind(SocketAddress host, int backlog):将ServerSocket绑定到特定地址。
反射
一、概念
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
通过反射进行访问信息:
getPackage():返回值类型为Package对象,获取该类存放的路径;
getName():String对象,获取该类的名称;
getSuperclass():Class对象,获取该类继承的类;
getConstructors():Constructor型数组,获取所有权限为public的构造方法。
getDeclaredContruectors():Constructor对象,获取当前所有构造方法
getMethods():Methods 型数组,获取所有权限为 public 的方法
getDeclaredMethods():Methods对象,获取当前对象的所有方法
getFields():Field 型数组,获取所有权限为 public 的成员变量
getDeclareFileds():Field对象,获取当前对象的所有成员变量
反射机制的优缺点:
优点:能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
与Java动态编译相结合,可以实现无比强大的功能。
对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象
缺点:反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题。
Java 反射机制在一般的 Java 应用开发中很少使用,即便是 Java EE 阶段也很少使用。
二、反射机制API
Java.lang.reflect包中所要用到的类:
Constructor 类:提供类的构造方法信息。
Field 类:提供类或接口中成员变量信息。
Method 类:提供类或接口成员方法信息。
Array 类:提供了动态创建和访问 Java 数组的方法。
Modifier 类:提供类和成员访问修饰符信息
三、通过反射访问构造方法
Constructor类的常用方法:
isVarArgs():查看该构造方法是否允许带可变数量的参数,如果允许,返回 true,否则返回 false
getParameterTypes():按照声明顺序以 Class 数组的形式获取该构造方法各个参数的类型
setAccessiable(boolean flag): 如果该构造方法的权限为 private,默认为不允许通过反射利用 netlnstance() 方法创建对象。如果先执行该方法,并将入口参数设置为 true,则允许创建对象。
getModifiers():获得可以解析出该构造方法所采用修饰符的整数。
四、通过反射执行方法
动态获取一个对象方法的信息,先需要通过以下的方法之一创建一个Method类型的对象或数组:
getMethods()
getMethods(String name,Class<?> …parameterTypes)
getDeclaredMethods()
getDeclaredMethods(String name,Class<?>...parameterTypes)
如果是访问指定的构造方法,需要根据该方法的入口参数的类型来访问。
Method类的常用方法:
getName():获取该方法的名称
getParameterType():按照声明顺序以Class数组的形式返回该方法各个参数的类型。
isVarArgs():查看该方法是否允许带有可变数量的参数,如果允许返回 true,否则返回false
getModifiers():获得可以解析出该方法所采用修饰符的整数
getReturnType():以 Class 对象的形式获得该方法的返回值类型
通过class对象可以获取继承关系:
class getSuperclass():获取父类类型
class[] getInterfaces()`:获取当前类实现的所有接口
通过`Class`对象的`isAssignableFrom()`方法可以判断一个向上转型是否可以实现。