前言
今天学习了网络编程的服务端多线程接收多个客户端、以及反射的基本概念
一、网络编程
我们想让服务端接收多个客户端的消息。并返回给客户端,是否登录成功
方法1:采用whlie循环
示例代码入戏:
public static void main(String[] args) throws IOException {
System.out.println("我是服务器端");
//服务器端
ServerSocket serverSocket = new ServerSocket(9998);
Boolean flag = true;
while (flag){//这里必须用flag变量,不然java会认为while是死循环,无法关闭serverSocket
//接收数据以及判断条件
}
方法2:采用多线程。
*示例代码所示:
public class Class_17_ThreadServer {
public static void main(String[] args) throws IOException {
System.out.println("我是服务器端");
//服务器端
ServerSocket serverSocket = new ServerSocket(9998);
Boolean flag = true;
while (flag) {
Socket client = serverSocket.accept();
new Thread(new Thread_Client(client)).start();
new Thread(new Thread_Client(client)).start();
}
serverSocket.close();
}
}
class Thread_Client implements Runnable {
private Socket socket;
private DataInputStream in = null;
private DataOutputStream os = null;
public Thread_Client() {
}
//定义初始化的输入流和输出流
public Thread_Client(Socket socket) throws IOException {
this.socket = socket;
in = new DataInputStream(socket.getInputStream());
os = new DataOutputStream(socket.getOutputStream());
}
//获取输入流
public String read() throws IOException {
return in.readUTF();
}
//判断数据
public Boolean judgement_user(String str1) {
String[] newstr = str1.split("&");
String username = newstr[0].substring(newstr[0].indexOf("=") + 1);
String password = newstr[1].substring(newstr[1].indexOf("=") + 1);
if ("华哥".equals(username) && "1234".equals(password)) {
return true;
} else {
return false;
}
}
//获取输出流,将结果响应给客户端
@Override
public void run() {
try {
//分割数据并判断
String str1 = read();
if (judgement_user(str1)) {
os.writeUTF("登录成功");
} else {
os.writeUTF("登录失败");
}
os.flush();
os.close();
in.close();
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
二、反射
1.什么是反射
反射(Reflection):JAVA的一个动态的机制
注意 : 反射发生在程序允许运行期间
反射的作用 :
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理;
反射的源头 :一个类型的Class对象 Class : 类Class的实例表示正在运行的 Java应用程序中的类和接口。存在于类加载到内部之后,独一份的,不会改变的,Class对象中封装着类的所有内容
获取反射的源头 :
1.类名.class
2.对象.getClass()
3.Class.forName("权限定名:包名.类名") -->推荐
示例代码所示:
public class Class_01_Reflection {
public static void main(String[] args) throws ClassNotFoundException {
//1.类名.class
Class<String> cls1 = String.class;
System.out.println(cls1.toString());
//2.对象.getClass()
Class cls2 = "abc".getClass();
System.out.println(cls2);
System.out.println(cls2==cls1);
//3.Class.forName("权限定名:包名.类名") -->推荐
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls3);
Class<?> str = Class.forName("java.lang.String");
System.out.println(str.getTypeName());
}
}
2.反射常用的方法
代码如下所示::
/*
Class类常用方法 :
1.String getName() 返回此Class对象表示的实体(类、接口、数组类、原始类型或 void)的名称。
2.Class<?>[] getInterfaces() 返回此Class对象表示的类或接口直接实现的接口。
3.Class<?>[] getInterfaces() 返回此Class对象表示的类或接口直接实现的接口。
4.int getModifiers() 返回此类或接口的 Java 语言修饰符,以整数编码。
5.String getPackageName() 返回完全限定的包名称。
6.String getSimpleName() 返回源代码中给出的基础类的简单名称。
7.boolean isPrimitive() 确定指定的Class对象是否表示原始类型。
8.boolean isInterface() 确定此Class对象是否表示接口类型。
9.boolean isEnum() 当且仅当此类在源代码中声明为枚举时才返回 true。
10.boolean isAnnotation() 如果此Class对象表示注释接口,则返回 true。
*/
public class Class_02_Reflection {
public static void main(String[] args) {
//String类型
Class<?> str = "hhh".getClass();
System.out.println(str.getSimpleName());
System.out.println(str.isArray());
//List集合类型
List<String> list = new ArrayList<>();
Class<List> str1 = (Class<List>) list.getClass();
System.out.println(Modifier.toString(str1.getModifiers()));
//数组类型
int[] arr = new int[12];
Class<int[]> arr1 = (Class<int[]>) arr.getClass();
System.out.println(Modifier.toString(arr1.getModifiers()));
System.out.println(arr1.getSimpleName());
}
}
输出结果如下:
总结
这就是对今天所学的总结。状态不好,明天继续加油!