龙岗网站app建设,做网站的app,设计家官网视频,做好产品策划的重要性一、反射与动态代理1、#xff08;4分#xff09;请通过反射技术#xff0c;为附件中的Person.class生成相应的.java代码#xff0c;java代码中的方法的方法体为空#xff0c;即方法内部代码不用生成。请注意生成的java代码的格式。2、#xff08;3分#xff09;请为第1…一、反射与动态代理1、4分请通过反射技术为附件中的Person.class生成相应的.java代码java代码中的方法的方法体为空即方法内部代码不用生成。请注意生成的java代码的格式。 2、3分请为第1题中Person类创建代理类 PersonProxyPersonProxy的在代理Person类的所有setter方法时把方法的调用时间、方法名称写入到文本文件中每一行日志的格式为* 时间2012-09-01 233424;方法名称setName;参数张小平3、3分请用动态代理技术完成第2题1.1 experiment1public class Person implements Speakable {private String name;//学生姓名private String Gender;//性别private String id;//身份证号private String tel;//电话public Person() {}public Person(String name, String Gender, String id, String tel) {this.name name;this.Gender Gender;this.id id;this.tel tel;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getGender() {return Gender;}public void setGender(String Gender) {this.Gender Gender;}public String getId() {return id;}public void setId(String id) {this.id id;}public String getTel() {return tel;}public void setTel(String tel) {this.tel tel;}Overridepublic String toString() {return PersonRefection{ name name \ , sex Gender \ , id id \ , tel tel \ };}Overridepublic void speak(String message) {System.out.println(message);}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.*;public class PersonRefection {static String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;static FileOutputStream fos;static {try {fos new FileOutputStream(pathName);} catch (FileNotFoundException e) {e.printStackTrace();}}static Class clazz;static {try {clazz Class.forName(Person);fos new FileOutputStream(pathName);} catch (ClassNotFoundException | FileNotFoundException e) {e.printStackTrace();}}public static void getPackage(String pathName) {String packageName clazz.getPackage().getName();String writePackage package packageName ;\n\n;try {fos.write(writePackage.getBytes());} catch (IOException e) {e.printStackTrace();}}public static void main(final String[] args) throws NoSuchMethodException, IOException, ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException {String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;FileOutputStream fos new FileOutputStream(pathName);Class clazz Class.forName(Person);//获取类所在的包名String packageName clazz.getPackage().getName();String writePackage package packageName ;\n\n;fos.write(writePackage.getBytes());//获取类中的权限修饰符及类名并输出String modifier Modifier.toString(clazz.getModifiers());String className clazz.getSimpleName();String writeClass modifier class className {\n;fos.write(writeClass.getBytes());//获取类中所有的字段Field[] fieldArray clazz.getDeclaredFields();for (Field f : fieldArray) {String mod Modifier.toString(f.getModifiers());String type f.getType().getSimpleName();String name f.getName();String writeField \t mod type name ;\n;fos.write(writeField.getBytes());}fos.write(\n.getBytes());//获取类中所有的构造方法Constructor[] constructorArray clazz.getConstructors();for (Constructor c : constructorArray) {String mod Modifier.toString(c.getModifiers());String writeConstructor \t mod className (;//获取构造方法里面所有的参数Class[] prams c.getParameterTypes();int count 0;for (Class cl : prams) {String pramName cl.getSimpleName();writeConstructor pramName args count;if (count prams.length - 1) {writeConstructor , ;}count;}writeConstructor ) {}\n;fos.write(writeConstructor.getBytes());}fos.write(\n.getBytes());//获取类中所有的方法Method[] methodArray clazz.getDeclaredMethods();for (Method m : methodArray) {String mod Modifier.toString(m.getModifiers());String type m.getReturnType().getSimpleName();String name m.getName();String writeMethod \t mod type name (;//与构造方法一样获取方法里面所有的参数Class[] prams m.getParameterTypes();int count 0;for (Class cl : prams) {String pramName cl.getSimpleName();writeMethod pramName args count;if (count prams.length - 1) {writeMethod , ;}count;}writeMethod ) {\n;if (type.equals(int) || type.equals(double)) {writeMethod \t\treturn 0;\n;} else if (type.equals(boolean)) {writeMethod \t\treturn false;\n;} else if (type.equals(void)) {writeMethod ;} else {writeMethod \t\treturn null;\n;}writeMethod \t}\n\n;fos.write(writeMethod.getBytes());}fos.write(}.getBytes());}
}
import java.io.IOException;public interface Speakable {public void speak(String message);public void setName(String args0) throws IOException;public void setTel(String args0) throws IOException;public void setGender(String args0) throws IOException;public void setId(String args0) throws IOException;
}
1.2 experiment2import homework2.experiment1.Person;import java.io.IOException;public class Bootstrap {public static void main(final String[] args) throws IOException {Person person new Person();PersonProxy personProxy new PersonProxy(person);personProxy.setId(123);personProxy.setName(魏乐天);}
}public class Person {private String name;private String Gender;private String id;private String tel;public Person() {}public Person(String args0, String args1, String args2, String args3) {}public String toString() {return null;}public String getName() {return null;}public void setName(String args0) {}public String getId() {return null;}public void setGender(String args0) {}public String getTel() {return null;}public void speak(String args0) {}public void setTel(String args0) {}public String getGender() {return null;}public void setId(String args0) {}}import homework2.experiment1.Person;
import homework2.experiment1.Speakable;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;//2、3分请为第1题中Person类创建代理类 PersonProxyPersonProxy的在代理Person类的所有setter方法时把方法的调用时间、方法名称写入到文本文件中每一行日志的格式为
// 时间2012-09-01 233424;方法名称setName;参数张小平
public class PersonProxy implements Speakable {Person person;File file new File(E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Log);public PersonProxy(Person person) {this.person person;}Overridepublic void speak(String message) {}public void setName(String name) throws IOException {WriteToText(file, setName, name);this.person.setName(name);}public void setGender(String Gender) throws IOException {WriteToText(file, setGender, Gender);this.person.setGender(Gender);}public void setId(String id) throws IOException {WriteToText(file, setId, id);this.person.setId(id);}public void setTel(String tel) throws IOException {WriteToText(file, setTel, tel);this.person.setTel(tel);}public void WriteToText(File file, String MethodName, String parameter) throws IOException {//如果文件不存在,就动态创建文件if (!file.exists()) {file.createNewFile();}FileWriter fw null;final String writeDate 时间: this.get_nowDate() ; 方法名称: MethodName ;参数: parameter;try {//设置为:True,表示写入的时候追加数据fw new FileWriter(file, true);//回车并换行fw.write(writeDate \r\n);} catch (final IOException e) {e.printStackTrace();} finally {if (fw ! null) {fw.close();}}}private String get_nowDate() {Calendar D Calendar.getInstance();int year 0;int moth 0;int day 0;int hour 0;int minute 0;int second 0;year D.get(Calendar.YEAR);moth D.get(Calendar.MONTH) 1;day D.get(Calendar.DAY_OF_MONTH);hour D.get(Calendar.HOUR_OF_DAY);minute D.get(Calendar.MINUTE);second D.get(Calendar.SECOND);String now_date String.valueOf(year) - String.valueOf(moth) - String.valueOf(day) String.valueOf(hour) : String.valueOf(minute) : String.valueOf(second);return now_date;}}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;public class PersonRefection {static String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;static FileOutputStream fos;static {try {fos new FileOutputStream(pathName);} catch (FileNotFoundException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException, ClassNotFoundException {getPackage();getClazz();getField();getConstructor();getMethod();}/*** 获取包名*/public static void getPackage() throws ClassNotFoundException, FileNotFoundException {String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;Class? clazz Class.forName(homework2.experiment2.Person);String packageName clazz.getPackage().getName();String writePackage package packageName ;\n\n;try {fos.write(writePackage.getBytes());} catch (IOException e) {e.printStackTrace();}}/*** 获取类中的权限修饰符及类名并输出*/public static void getClazz() throws IOException, ClassNotFoundException {String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;Class? clazz Class.forName(homework2.experiment2.Person);String modifier Modifier.toString(clazz.getModifiers());String className clazz.getSimpleName();String writeClass modifier class className {\n;fos.write(writeClass.getBytes());}/*** 获取类中所有的字段*/public static void getField() throws IOException, ClassNotFoundException {String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;Class? clazz Class.forName(homework2.experiment2.Person);Field[] fieldArray clazz.getDeclaredFields();for (Field f : fieldArray) {String mod Modifier.toString(f.getModifiers());String type f.getType().getSimpleName();String name f.getName();String writeField \t mod type name ;\n;fos.write(writeField.getBytes());}fos.write(\n.getBytes());}/*** 获取类中所有的构造方法*/public static void getConstructor() throws IOException, ClassNotFoundException {String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;Class? clazz Class.forName(homework2.experiment2.Person);String className clazz.getSimpleName();Constructor[] constructorArray clazz.getConstructors();for (Constructor c : constructorArray) {String mod Modifier.toString(c.getModifiers());String writeConstructor \t mod className (;//获取构造方法里面所有的参数Class[] prams c.getParameterTypes();int count 0;for (Class cl : prams) {String pramName cl.getSimpleName();writeConstructor pramName args count;if (count prams.length - 1) {writeConstructor , ;}count;}writeConstructor ) {}\n;fos.write(writeConstructor.getBytes());}fos.write(\n.getBytes());}/*** 获取类中所有的方法*/public static void getMethod() throws IOException, ClassNotFoundException {String pathName E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment2\\Person.java;Class? clazz Class.forName(homework2.experiment2.Person);Method[] methodArray clazz.getDeclaredMethods();for (Method m : methodArray) {String mod Modifier.toString(m.getModifiers());String type m.getReturnType().getSimpleName();String name m.getName();String writeMethod \t mod type name (;//与构造方法一样获取方法里面所有的参数Class[] prams m.getParameterTypes();int count 0;for (Class cl : prams) {String pramName cl.getSimpleName();writeMethod pramName args count;if (count prams.length - 1) {writeMethod , ;}count;}writeMethod ) {\n;switch (type) {case int:case double:writeMethod \t\treturn 0;\n;break;case boolean:writeMethod \t\treturn false;\n;break;case void:writeMethod ;break;default:writeMethod \t\treturn null;\n;break;}writeMethod \t}\n\n;fos.write(writeMethod.getBytes());}fos.write(}.getBytes());}}1.3 experiment3import homework2.experiment1.Speakable;import java.io.IOException;
import java.lang.reflect.Proxy;public class BootStrap {public static void main(final String[] args) throws IOException {//创建一个真实对象Person person new Person();//创建一个动态代理对象MyProxy myProxy new MyProxy(person);//获取被代理类的CLassLoader对象ClassLoader loader person.getClass().getClassLoader();//动态构造一个代理对象Speakable speakable (Speakable) Proxy.newProxyInstance(loader,new Class[]{Speakable.class},//接口对象数组表示我们要给代理对象提供一个怎样的接口如果提供了这样一组接口数组就是声明了代理类实现了这些接口代理类就可以调用接口中声明的所有方法。myProxy);speakable.setGender(man);}
}
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Calendar;public class MyProxy implements InvocationHandler {File file new File(E:\\学习\\代码\\AdvancedJAVA\\src\\homework2\\experiment3\\Log);private Object proxied;public MyProxy(Object proxied) {this.proxied proxied;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//proxy:代理类代理的真实代理对象//method我们要调用某个对象真实的方法的Method对象//args:代理对象方法传递的参数WriteToText(file, method.getName(), (String) args[0]);method.invoke(this.proxied, args);return null;}public void WriteToText(File file, String MethodName, String parameter) throws IOException {//如果文件不存在,就动态创建文件if (!file.exists()) {file.createNewFile();}FileWriter fw null;String writeDate 时间: this.get_nowDate() ; 方法名称: MethodName ;参数: parameter;try {//设置为:True,表示写入的时候追加数据fw new FileWriter(file, true);//回车并换行fw.write(writeDate \r\n);} catch (IOException e) {e.printStackTrace();} finally {if (fw ! null) {fw.close();}}}private String get_nowDate() {Calendar D Calendar.getInstance();int year 0;int moth 0;int day 0;int hour 0;int minute 0;int second 0;year D.get(Calendar.YEAR);moth D.get(Calendar.MONTH) 1;day D.get(Calendar.DAY_OF_MONTH);hour D.get(Calendar.HOUR_OF_DAY);minute D.get(Calendar.MINUTE);second D.get(Calendar.SECOND);String now_date String.valueOf(year) - String.valueOf(moth) - String.valueOf(day) String.valueOf(hour) : String.valueOf(minute) : String.valueOf(second);return now_date;}
}public class Person implements Speakable {private String name;private String Gender;private String id;private String tel;public Person() {}public Person(String args0, String args1, String args2, String args3) {}public String toString() {return null;}public String getName() {return null;}public void setName(String args0) {}public String getId() {return null;}public void setGender(String args0) {}public String getTel() {return null;}public void speak(String args0) {}public void setTel(String args0) {}public String getGender() {return null;}public void setId(String args0) {}}import java.io.IOException;public interface Speakable {public void speak(String message);public void setName(String args0) throws IOException;public void setTel(String args0) throws IOException;public void setGender(String args0) throws IOException;public void setId(String args0) throws IOException;
}
二、基于数据库的学生管理系统1、请编程实现基于数据库的学生信息管理程序程序的功能有显示所有学生、新增学生、删除学生、修改学生、查找学生根据学号、姓名、班级、性别、专业、学院等程序采用命令行方式。 2、请编程实现把从数据库中查询出的学生信息记录集ResultSet中的记录转换为学生对象。import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;//1、请编程实现基于数据库的学生信息管理程序程序的功能有显示所有学生、新增学生、删除学生、修改学生、查找学生根据学号、姓名、班级、性别、专业、学院等程序采用命令行方式。
// 2、请编程实现把从数据库中查询出的学生信息记录集ResultSet中的记录转换为学生对象。/*** 建立与数据库之间的连接会话所有的操作都是基于这个会话基础上进行的*/
public class MySqlDAO {public static Connection getConnection() throws Exception {String driverName com.mysql.cj.jdbc.Driver; //驱动名称String url jdbc:mysql://localhost:3306/student; //连接字符串String username root; //用户名String password lele20011019; //密码Class.forName(driverName); //加载数据库的驱动驱动程序自动调用DriverManger中方法将自身注册到管理器中return DriverManager.getConnection(url, username, password);}/*** 获取Statement对象通过Statement执行SQL语句** return* throws Exception*/public static Statement getStatement() throws Exception {return getConnection().createStatement();}/*** 获取PreparedStatement对象通过PreparedStatement执行SQL语句** param sql* return* throws Exception*/public static PreparedStatement preparedStatement(String sql) throws Exception {return getConnection().prepareStatement(sql);}public static void connectionClose() throws Exception {getConnection().close();}
}public class Student {private int Id; //学号private String Name; //姓名private String Gender; //性别private String college; //学院private String Major; //专业private int Clazz; //班级public Student() {}public Student(int id, String name, String gender, String college, String major, int Clazz) {this.Id id;this.Name name;this.Gender gender;this.college college;this.Major major;this.Clazz Clazz;}public int getId() {return Id;}public void setId(int id) {this.Id id;}public String getName() {return Name;}public void setName(String name) {this.Name name;}public String getGender() {return Gender;}public void setGender(String gender) {if (gender.equals(男) || gender.equals(女)) {this.Gender gender;} else {try {throw new IllegalAccessException(性别只能为男或女);} catch (IllegalAccessException E) {E.printStackTrace();}}}public String getCollege() {return college;}public void setCollege(String college) {this.college college;}public String getMajor() {return Major;}public void setMajor(String major) {this.Major major;}public int getClazz() {return Clazz;}public void setClass(int Clazz) {this.Clazz Clazz;}
}import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;import static homework3.MySqlDAO.connectionClose;public class StudentManagementSystem {static Scanner input new Scanner(System.in);static ResultSet rs null;public static void main(String[] args) throws Exception {
// Student student1 new Student(1, 魏乐天, 男, 两江人工智能学院, 软件工程, 2);
// Student student2 new Student(2, 茹祎龙, 男, 两江人工智能学院, 软件工程, 2);
// Student student3 new Student(3, 宋梦洋, 男, 两江人工智能学院, 软件工程, 2);
// Student student4 new Student(4, 边帝行, 男, 两江人工智能学院, 软件工程, 2);
// Student student5 new Student(5, 张毅敏, 男, 电子与电气工程学院, 自动化, 1);startSystem();}public static void startSystem() throws Exception {while (true) {int choice;System.out.println(学生管理系统);System.out.println(请选择所需功能);System.out.println(1.创建学生信息);System.out.println(2.删除学生信息);System.out.println(3.修改学生信息);System.out.println(4.查询学生信息);System.out.println(5.退出);choice input.nextInt();if (choice 1) {createStudent();} else if (choice 2) {while (true) {System.out.println(请输入要删除学生的学号(输入-1退出));int no input.nextInt();if (no -1)break;deleteStudent(no);}} else if (choice 3) {while (true) {System.out.println(输入要修改学生的学号如果学号不存在则创建(输入-1退出));int no input.nextInt();if (no -1)break;updateStudent(no);}} else if (choice 4) {int choice1;while (true) {System.out.println(请输入查询的方式);System.out.println(1.通过学号查询);System.out.println(2.通过姓名查询);System.out.println(3.通过性别查询);System.out.println(4.通过学院查询);System.out.println(5.通过专业查询);System.out.println(6.通过班级查询);System.out.println(7.退出);choice1 input.nextInt();if (choice1 1) {System.out.println(请输入学号);int xuehao input.nextInt();selectStudentById(xuehao);} else if (choice1 2) {System.out.println(请输姓名);String name1 input.next();selectStudentByName(name1);} else if (choice1 3) {System.out.println(请输入性别);String gender1 input.next();selectStudentByGender(gender1);} else if (choice1 4) {System.out.println(请输入学院);String college1 input.next();selectStudentByCollege(college1);} else if (choice1 5) {System.out.println(请输入专业);String major1 input.next();selectStudentByMajor(major1);} else if (choice1 6) {System.out.println(请输入班级);int class1 input.nextInt();selectStudentByClass(class1);} else {break;}}} else {break;}}}public static void createStudent() throws Exception {System.out.println(请输入你想创建的学生的信息(输入-1退出));int no, clazz;String name, gender, college, major;while (true) {System.out.println(学号);no input.nextInt();if (no -1)break;System.out.println(姓名);name input.next();if (name.equals(-1))break;System.out.println(性别);gender input.next();if (gender.equals(-1))break;System.out.println(学院);college input.next();if (college.equals(-1))break;System.out.println(专业);major input.next();if (major.equals(-1))break;System.out.println(班级);clazz input.nextInt();if (clazz -1)break;Student newStudent new Student(no, name, gender, college, major, clazz);insertStudent(newStudent);}}public static boolean tableNameExist(String tableName) throws Exception {String sql select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMAstudent and TABLE_NAME tableName ;PreparedStatement ps MySqlDAO.preparedStatement(sql);ps.execute();ResultSet rs ps.executeQuery();rs.close();ps.close();connectionClose();return rs.next();}/*** 建表*/public static void createTable(String tableName) throws Exception {String sql create table tableName (No int primary key, name char(20),gender char(4),college char(100),major char(100),Class int);if (!tableNameExist(tableName)) {PreparedStatement ps MySqlDAO.preparedStatement(sql);ps.execute();ps.close();} else {try {throw new Exception(该表已经存在);} catch (Exception E) {E.printStackTrace();}}}/*** 插入学生信息*/public static void insertStudent(Student student) throws Exception {String sql insert into student values(?,?,?,?,?,?);PreparedStatement ps MySqlDAO.preparedStatement(sql);ps.setInt(1, student.getId());ps.setString(2, student.getName());ps.setString(3, student.getGender());ps.setString(4, student.getCollege());ps.setString(5, student.getMajor());ps.setInt(6, student.getClazz());ps.execute();ps.close();connectionClose();}/*** 删除学生信息*/public static void deleteStudent(int no) throws Exception {String sql delete from student where No?;PreparedStatement ps MySqlDAO.preparedStatement(sql);ps.setInt(1, no);ps.execute();ps.close();connectionClose();}/*** 更新学生信息*/public static void updateStudent(int no) throws Exception {int clazz;String name, gender, college, major;deleteStudent(no);System.out.println(姓名);name input.next();System.out.println(性别);gender input.next();System.out.println(学院);college input.next();System.out.println(专业);major input.next();System.out.println(班级);clazz input.nextInt();Student newStudent new Student(no, name, gender, college, major, clazz);insertStudent(newStudent);}/*** 打印学生信息*/public static void printInformation(ResultSet rs) throws SQLException {while (rs.next()) {System.out.println(id: rs.getInt(no));System.out.println(name: rs.getString(name));System.out.println(gender: rs.getString(gender));System.out.println(college: rs.getString(college));System.out.println(major: rs.getString(major));System.out.println(class: rs.getInt(class));System.out.println();}}public static void executeToRs(PreparedStatement ps) throws Exception {rs ps.executeQuery();ps.close();connectionClose();}/*** 通过id查询学生信息*/public static void selectStudentById(int id) throws Exception {String sql select * from student where no id;PreparedStatement ps MySqlDAO.preparedStatement(sql);executeToRs(ps);printInformation(rs);ps.close();connectionClose();}/*** 通过name查询学生信息*/public static void selectStudentByName(String name) throws Exception {String sql select * from student where name name;PreparedStatement ps MySqlDAO.preparedStatement(sql);executeToRs(ps);printInformation(rs);ps.close();connectionClose();}/*** 通过性别查询学生信息*/public static void selectStudentByGender(String gender) throws Exception {String sql select * from student where gender gender;PreparedStatement ps MySqlDAO.preparedStatement(sql);executeToRs(ps);printInformation(rs);ps.close();connectionClose();}/*** 通过学院查询学生信息*/public static void selectStudentByCollege(String college) throws Exception {String sql select * from student where college college;PreparedStatement ps MySqlDAO.preparedStatement(sql);executeToRs(ps);printInformation(rs);ps.close();connectionClose();}/*** 通过专业查询学生信息*/public static void selectStudentByMajor(String major) throws Exception {String sql select * from student where major major;PreparedStatement ps MySqlDAO.preparedStatement(sql);executeToRs(ps);printInformation(rs);ps.close();connectionClose();}/*** 通过班级查询学生信息*/public static void selectStudentByClass(int clazz) throws Exception {String sql select * from student where class clazz;PreparedStatement ps MySqlDAO.preparedStatement(sql);executeToRs(ps);printInformation(rs);ps.close();connectionClose();}public static void rsToObject(ResultSet rs) throws SQLException {ListStudent students new ArrayList();while (rs.next()) {int no rs.getInt(no);String name rs.getString(name);String gender rs.getString(gender);String college rs.getString(college);String major rs.getString(major);int clazz rs.getInt(class);students.add(new Student(no, name, gender, college, major, clazz));}}}
三、注解、3.1 experiment11.创建Person类Person的属性有* String name 姓名* String sex 性别* Integer age 年龄,* String idNo 身份证号* Boolean isMarried 是否已婚* 请生成相应的getter、setter方法。请编写注解Label表示所注解对象的中文名称√* 请把Label注解标注在Person类和Person的每个属性上面。√* 请编写PersonInput类负责提示录入人员的相关属性提示必须是注解Label所标注的中文名称。√* 请编写PersonDisplay负责显示人员信息显示时的属性名称必须为注解Label所标注的中文名称√* PersonInput类与PersonDisplay类实现了共同的接口PersonAction接口PersonAction有方法process方法process的签名为public Person process(Person person);√import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Target({ElementType.FIELD, ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
public interface Label {String value();
}
//注解处理器接口
public interface PersonAction {public Person process(Person person) throws IllegalAccessException;
}public class Person {Label(姓名)String name; //姓名Label(性别)String sex; //性别Label(年龄)Integer age; //年龄Label(身份证号)String idNo; //身份证号Label(是否已婚)Boolean isMarried; //是否已婚public Person() {}public Person(String name, String sex, Integer age, String idNo, boolean isMarried) {this.name name;this.sex sex;this.age age;this.idNo idNo;this.isMarried isMarried;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getIdNo() {return idNo;}public void setIdNo(String idNo) {this.idNo idNo;}public Boolean isMarried() {return isMarried;}public void setMarried(Boolean married) {isMarried married;}
}
import java.lang.reflect.Field;/*** 负责显示人员信息显示时的属性名称必须为注解Label所标注的中文名称*/
public class PersonDisplay implements PersonAction {Overridepublic Person process(Person person) throws IllegalAccessException {Class clazz person.getClass();Field[] fields clazz.getDeclaredFields();for (Field field : fields) {//获取Label注解的value值if (field.isAnnotationPresent(Label.class)) {String name field.getAnnotation(Label.class).value();System.out.print(name :);}//获取属性的值Object obj field.get(person);System.out.println(obj);}return person;}
}
import java.lang.reflect.Field;
import java.util.Scanner;/*** 负责提示录入人员的相关属性提示必须是注解Label所标注的中文名称。*/
public class PersonInput implements PersonAction {Overridepublic Person process(Person person) throws IllegalAccessException {Scanner input new Scanner(System.in);Class clazz person.getClass();//获取Class对象Field[] fields clazz.getDeclaredFields();//通过Class对象获取Field对象//遍历获取的person对象的所有字段for (Field field : fields) {Object obj field.get(person);if (obj null) {String s field.getAnnotation(Label.class).value();System.out.print(请输入 s :);String s1 input.next();if (field.getType().getName().contains(String)) {//获取的字段是String类型field.set(person, s1);} else if (field.getType().getName().contains(Integer)) {//获取的字段是Integer类型field.set(person, Integer.parseInt(s1));} else if (field.getType().getName().contains(Boolean)) {//获取字段是Boolean类型field.set(person, Boolean.parseBoolean(s1));}}}return person;}
}public class text {public static void main(String[] args) throws IllegalAccessException {Person person new Person();PersonInput personInput new PersonInput();personInput.process(person);PersonDisplay personDisplay new PersonDisplay();personDisplay.process(person);}
}3.2 experiment2 2.在第一题目的基础上编写注解Column,// 属性有Label 表示类的属性的显示名称// Nullable 表示是否允许属性值为空// MaxLength 表示文本属性的最大长度// MinLength表示文本属性的最小长度// MaxValue表示最大值// MinValue表示最小值// 把注解Column加在Person类的每个属性上在输入Person时根据注解Column的配置进行校验。// 第一题的Label只标注在类上。根据注解生成Person类对应的数据库表创建语句以及生成数据库表的删除、新增、修改SQL语句。// 并利用JDBC实现数据库操作。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;// 2.在第一题目的基础上编写注解Column,
// 属性有Label 表示类的属性的显示名称
// Nullable 表示是否允许属性值为空
// MaxLength 表示文本属性的最大长度
// MinLength表示文本属性的最小长度
// MaxValue表示最大值
// MinValue表示最小值
// 把注解Column加在Person类的每个属性上在输入Person时根据注解Column的配置进行校验。
// 第一题的Label只标注在类上。根据注解生成Person类对应的数据库表创建语句以及生成数据库表的删除、新增、修改SQL语句。
// 并利用JDBC实现数据库操作。
Target({ElementType.FIELD, ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
public interface Column {Label label(); // 表示类的属性的显示名称boolean Nullable() default false;// Nullable 表示是否允许属性值为空int MaxLength() default 100;// MaxLength 表示文本属性的最大长度int MinLength() default 0;// MinLength表示文本属性的最小长度int MaxValue() default 999999999;// MaxValue表示最大值int MinValue() default 0;// MinValue表示最小值}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Target({ElementType.FIELD, ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
public interface Label {String value();
}package homework4.experiment;import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;/*** 把注解Column加在Person类的每个属性上在输入Person时根据注解Column的配置进行校验。* 第一题的Label只标注在类上。根据注解生成Person类对应的数据库表创建语句以及生成数据库表的删除、新增、修改SQL语句。* 并利用JDBC实现数据库操作。*/
public class CreateSQL {static PreparedStatement pd null;static ResultSet rs;static Scanner input new Scanner(System.in);public String CreateTable(Person person) {Class? extends Person clazz person.getClass();Field[] fields clazz.getDeclaredFields();Label name clazz.getAnnotation(Column.class).label();StringBuilder sql new StringBuilder(create table if not exists name.value() (\n);for (Field field : fields) {String str field.getAnnotation(Column.class).label().value();int maxLength field.getAnnotation(Column.class).MaxLength();//如果时Integer类型if (field.getType().getName().contains(Integer)) {sql.append(str).append( int,\n);}//如果是Boolean或者String类型if (field.getType().getName().contains(String) || field.getType().getName().contains(Boolean)) {sql.append(str).append( varchar().append(maxLength).append(),\n);}//添加主键if (str.equals(身份证号)) {sql new StringBuilder(sql.substring(0, sql.length() - 2));//截取字符串sql.append( primary key,\n);}}sql new StringBuilder(sql.substring(0, sql.length() - 2));sql.append(\n););System.out.println(sql);return sql.toString();}public String InsertInf(Person person) {Class? extends Person clazz person.getClass();Label name clazz.getAnnotation(Column.class).label();StringBuilder sql new StringBuilder(insert into name.value() values();Field[] fields clazz.getDeclaredFields();for (int i 0; i fields.length; i) {Field field fields[i];String value field.getAnnotation(Column.class).label().value();System.out.println(请输入 value : );String str input.next();//根据注解Column的配置进行校验if (!isTrue(field, str)) {i--;continue;}//判断性别输入是否输入正确if (value.equals(性别)) {if (!str.equals(男) !str.equals(女)) {System.out.println(您输入的性别不符合规范请重新输入);i--;continue;}}//判断是否结婚输入是否正确if (value.equals(是否结婚)) {if (!str.equals(是) !str.equals(否)) {System.out.println(您输入的结婚情况不符合规范请重新输入);i--;continue;}}if (!isContainNum(str)) {sql.append().append(str).append().append(, );} else {sql.append(str).append(, );}}sql new StringBuilder(sql.substring(0, sql.length() - 2));sql.append(););System.out.println(sql);return sql.toString();}public String deleteInf(Person person) {Class? extends Person clazz person.getClass();Label name clazz.getAnnotation(Column.class).label();StringBuilder sql new StringBuilder(delete from name.value() where );Field[] fields clazz.getDeclaredFields();String value fields[0].getAnnotation(Column.class).label().value();System.out.println(请输入您要删除的 value : );String str input.next();if (!isContainNum(str)) {sql.append(value).append( ).append().append(str).append();} elsesql.append(value).append( ).append(str).append(;);System.out.println(sql);return sql.toString();}//更新操作public String updateInf(Person person) {Class? extends Person clazz person.getClass();Label tableName clazz.getAnnotation(Column.class).label();String sql update tableName.value() set ;Field[] fields clazz.getDeclaredFields();String[] values new String[fields.length];System.out.println(请输入要修改的姓名:);String str2 input.nextLine();System.out.println(请选择您要修改的属性:);for (int i 0; i values.length; i) {values[i] fields[i].getAnnotation(Column.class).label().value();System.out.println((i 1) -- values[i]);}String choice input.nextLine();int choiceNum Integer.parseInt(choice);String str1;while (true) {System.out.println(请输入修改后的值:);str1 input.nextLine();if (isTrue(fields[choiceNum - 1], str1)) {break;}}switch (choiceNum) {case 1:if (!isContainNum(str1)) {sql values[0] \ str1 \;} else {sql values[0] str1;}break;case 2:if (!isContainNum(str1)) {sql values[1] \ str1 \;} else {sql values[1] str1;}break;case 3:if (!isContainNum(str1)) {sql values[2] \ str1 \;} else {sql values[2] str1;}break;case 4:if (!isContainNum(str1)) {sql values[3] \ str1 \;} else {sql values[3] str1;}break;case 5:if (!isContainNum(str1)) {sql values[4] \ str1 \;} else {sql values[4] str1;}break;default:break;}if (!isContainNum(str2)) {sql where fields[0].getAnnotation(Column.class).label() \ str2 \;} else {sql where fields[0].getAnnotation(Column.class).label() str2;}System.out.println(sql);return sql;}//根据注解Column的配置进行校验public boolean isTrue(Field f, String str) {String value f.getAnnotation(Column.class).label().value();boolean nullable f.getAnnotation(Column.class).Nullable();int maxLength f.getAnnotation(Column.class).MaxLength();int minLength f.getAnnotation(Column.class).MinLength();int maxValue f.getAnnotation(Column.class).MaxValue();int minValue f.getAnnotation(Column.class).MinValue();if (!nullable str.isEmpty()) {System.out.println(输入的信息不能为空请重新输入);return false;}if (maxLength 0) {int num;try {num Integer.parseInt(str);} catch (Exception e) {System.out.println(您输入的 value 不符合规范请重新输入);return false;}if (num minValue || num maxValue) {System.out.println(您输入的 value 不符合规范请重新输入);return false;}} else {int len str.length();if (len maxLength || len minLength) {System.out.println(您输入的 value 不符合规范请重新输入);return false;}}return true;}public static boolean isContainNum(String str) {for (int i 0; i str.length(); i) {if (str.charAt(i) 0 str.charAt(i) 9) {return true;}}return false;}
}
public class demo {public static void main(String[] args) {Person person new Person();Class? extends Person c person.getClass();Label l c.getAnnotation(Column.class).label();System.out.println(l.value());}
}package homework4.experiment;import java.sql.PreparedStatement;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.Scanner;/*** 把注解Column加在Person类的每个属性上在输入Person时根据注解Column的配置进行校验。* 第一题的Label只标注在类上。根据注解生成Person类对应的数据库表创建语句以及生成数据库表的删除、新增、修改SQL语句。* 并利用JDBC实现数据库操作。*/
public class ExecuteSQL {static PreparedStatement ps null;static CreateSQL sql new CreateSQL();static Scanner input new Scanner(System.in);static Person person new Person();public static void main(String[] args) throws Exception {mainMenu();closeConnection();}public static void mainMenu() throws Exception {System.out.println(请选择您要进行的操作);System.out.println(1--自动生成表Person);System.out.println(2--增加数据);System.out.println(3--删除数据);System.out.println(4--修改数据);System.out.println(5--退出程序);Scanner sc new Scanner(System.in);int choice sc.nextInt();switch (choice) {case 1:createTable();mainMenu();break;case 2:insert();mainMenu();break;case 3:delete();mainMenu();break;case 4:update();mainMenu();break;case 5:break;default:System.out.println(请输入正确的选项);mainMenu();break;}}//建表public static void createTable() throws Exception {System.out.println(生成表中......);String create sql.CreateTable(person);ps MySqlDAO.preparedStatement(create);ps.executeUpdate();System.out.println(成功生成);}//向表中添加信息public static void insert() throws Exception {try {String insertSQL sql.InsertInf(person);ps MySqlDAO.preparedStatement(insertSQL);ps.executeUpdate();} catch (SQLIntegrityConstraintViolationException e) {System.out.println(您输入的身份证号码有重复请重新输入);insert();}}//删除信息1public static void delete() throws Exception {String deleteSQL sql.deleteInf(person);ps MySqlDAO.preparedStatement(deleteSQL);ps.executeUpdate();}//更新信息public static void update() throws Exception {String updateSQL sql.updateInf(person);ps MySqlDAO.preparedStatement(updateSQL);ps.executeUpdate();}public static void closeConnection() throws Exception {ps.close();MySqlDAO.getConnection().close();}}
package homework4.experiment;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;public class MySqlDAO {public static Connection getConnection() throws Exception {String driverName com.mysql.cj.jdbc.Driver;String url jdbc:mysql://localhost:3306/demo;String userName root;String password ;//自行填写密码Class.forName(driverName);Connection con DriverManager.getConnection(url, userName, password);return con;}public static PreparedStatement preparedStatement(String sql) throws Exception {return getConnection().prepareStatement(sql);}
}
package homework4.experiment;/*** 1.创建Person类Person的属性有* String name 姓名* String sex 性别* Integer age 年龄,* String idNo 身份证号* Boolean isMarried 是否已婚* 请生成相应的getter、setter方法。请编写注解Label表示所注解对象的中文名称√* 请把Label注解标注在Person类和Person的每个属性上面。√* 请编写PersonInput类负责提示录入人员的相关属性提示必须是注解Label所标注的中文名称。√* 请编写PersonDisplay负责显示人员信息显示时的属性名称必须为注解Label所标注的中文名称√* PersonInput类与PersonDisplay类实现了共同的接口PersonAction接口PersonAction有方法process方法process的签名为public Person process(Person person);√*/
Column(label Label(Person))
public class Person {Column(label Label(姓名))String name; //姓名Column(label Label(性别))String sex; //性别Column(label Label(年龄), MaxValue 120)Integer age; //年龄Column(label Label(身份证号))String idNo; //身份证号Column(label Label(是否已婚))Boolean isMarried; //是否已婚public Person() {}public Person(String name, String sex, Integer age, String idNo, boolean isMarried) {this.name name;this.sex sex;this.age age;this.idNo idNo;this.isMarried isMarried;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getIdNo() {return idNo;}public void setIdNo(String idNo) {this.idNo idNo;}public Boolean isMarried() {return isMarried;}public void setMarried(Boolean married) {isMarried married;}
}
四、TCP、UDP4.1 experiment1请分别采用TCP、UDP协议编程实现一对一的文件上传。TCP
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {//1.创建一个socket连接Socket socket new Socket(InetAddress.getByName(localhost), 9000);//2.创建一个输出流OutputStream os socket.getOutputStream();//3.文件流,读入文件FileInputStream fis new FileInputStream(new File(E:\\学习\\代码\\AdvancedJAVA\\src\\homework5\\experiment1\\header-logo.png));//4.写出文件byte[] buffer new byte[1024];int lens;while ((lens fis.read(buffer)) ! -1) {os.write(buffer, 0, lens);}//通知服务器我已经传输完了已经结束了。socket.shutdownOutput();//我已经传输完了// 确定服务器接收完毕才能够断开连接InputStream is socket.getInputStream();ByteArrayOutputStream baos new ByteArrayOutputStream();byte[] buffer2 new byte[1024];int lens2;while ((lens2 is.read(buffer2)) ! -1) {baos.write(buffer2, 0, lens2);}System.out.println(baos.toString());//5.关闭资源baos.close();fis.close();os.close();socket.close();}
}import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;public class Server {public static void main(String[] args) throws IOException {//1创建服务ServerSocket serverSocket new ServerSocket(9000);//2监听客户端的连接Socket socket serverSocket.accept();//阻塞式监听会一直等待客户端。//3获取输入流InputStream is socket.getInputStream();//4文件输出,管道输出流FileOutputStream fos new FileOutputStream(new File(receive.png));byte[] buffer new byte[1024];int lens;while ((lens is.read(buffer)) ! -1) {fos.write(buffer, 0, lens);}//通知客户端我接受完毕了OutputStream os socket.getOutputStream();os.write(我接收完毕了你可以断开了.getBytes(StandardCharsets.UTF_8));//关闭资源os.close();fos.close();is.close();socket.close();serverSocket.close();}
}
UDPimport java.io.FileOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class receive {public static void main(String[] args) throws Exception {//开放端口DatagramSocket socket new DatagramSocket(9090);//接收数据包byte[] buffer new byte[1024];DatagramPacket packet new DatagramPacket(buffer, 0, buffer.length);//接收socket.receive(packet);//将得到的packet进行拆包int len packet.getLength();byte[] data packet.getData();String str new String(data, 0, len);//利用FileOutputStream将数据写入到文件中String targetPath E:\\学习\\代码\\AdvancedJAVA\\src\\homework5\\experiment1\\21.png;FileOutputStream fos new FileOutputStream(targetPath);fos.write(str.getBytes());//关闭相关流System.out.println(文件上传完毕);fos.close();socket.close();//关闭连接socket.close();}
}import java.io.FileInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;//不需要连接服务器
public class send {public static void main(String[] args) throws Exception {//1.建立一个socketDatagramSocket socket new DatagramSocket();//2.建立一个包//发送给谁InetAddress localhost InetAddress.getByName(localhost);int port 9090;FileInputStream fis new FileInputStream(E:\\学习\\代码\\AdvancedJAVA\\src\\homework5\\experiment1\\2.png);byte[] buffer new byte[1024];int lens;String str ;while ((lens fis.read(buffer)) ! -1) {str new String(buffer, 0, lens);}buffer str.getBytes();DatagramPacket packet new DatagramPacket(buffer, buffer.length, localhost, port);//3.发送包socket.send(packet);//关闭流socket.close();}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;//不需要连接服务器
public class UDPClient {public static void main(String[] args) throws Exception {//建立一个SocketDatagramSocket socket new DatagramSocket();//建个包String msg 你好啊服务器!;//发送给谁InetAddress address InetAddress.getByName(localhost);int port 9090;//数据数据的起始长度要发送给谁DatagramPacket packet new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, address, port);//发送包socket.send(packet);//关闭socket.close();}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPReceive {public static void main(String[] args) throws Exception {//开放端口DatagramSocket socket new DatagramSocket(9090);//接收数据包byte[] buffer new byte[1024];DatagramPacket packet new DatagramPacket(buffer, 0, buffer.length);//接收socket.receive(packet);System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(), 0, packet.getLength()));socket.close();}
}
4.2 experiment22.编写一对多的聊天程序程序由服务器和客户端两部分构成两部分的交互方式如下a.客户端发送命令register name”xu”/ 给服务器端注册用户服务器端如果允许注册则返回消息result command”register” state”ok” /否则返回消息result command”register” state”error” message”” /b.客户端发送命令login name”xu”/ 给服务器端进行登录, 服务器端如果允许登录则返回消息result command” login ” state”ok” /否则返回消息result command”login” state”error” message”” /c.客户端发送命令message from”xu” to”zhang” message”this is a test” 给服务器端服务器端收到命令后返回消息result command” message ” state”ok” /d.服务器向指定客户端发送命令message from”xu” to”zhang” message”this is a test”如果客户端收到消息则返回result command” message ” state”ok” /如果message命令中的 from属性为空则表示由服务器发送的消息。e.客户端发送命令logout name”xu”/ 给服务器端进行注销登录, 服务器端如果允许注销登录则返回消息result command” logout ” state”ok” /否则返回消息result command”loginout” state”error” message”” /程序可以采用GUI也可采用命令行的方式。package homework5.experiment2;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;public class Client01 {private static String user;public static void main(String[] args) throws IOException {System.out.println(————————欢迎来到魏乐天设计的聊天界面窗口————————);Socket socket new Socket(InetAddress.getByName(localhost), 8888);Scanner scanner new Scanner(System.in);while (true) {InputStreamReader reader new InputStreamReader(socket.getInputStream());BufferedReader bufferedReader new BufferedReader(reader);PrintWriter writer new PrintWriter(socket.getOutputStream());System.out.println(输入相应数字选择您要进行的操作);System.out.println(1--注册用户);System.out.println(2--登陆账户);System.out.println(3--发送信息);System.out.println(4--登出账户);System.out.println(5--接收信息);System.out.println(其他数字--退出系统);int choice scanner.nextInt();String instruction ;if (choice 1) {System.out.print(请输入您想要注册的账户名称:);String name scanner.next();instruction register name\ name \/ ;writer.println(instruction);writer.flush();} else if (choice 2) {System.out.print(请输入您想要登录的账户名称:);user scanner.next();instruction login name\ user \/;writer.println(instruction);writer.flush();} else if (choice 3) {System.out.print(请输入您想要发送的用户名称:);String toUser scanner.next();System.out.println(toUser);System.out.println(你说:);String message scanner.next();System.out.println(message);instruction message from\ user \ to\ toUser \ message\ message \;writer.println(instruction);writer.flush();} else if (choice 4) {System.out.print(请输入您想要登出的账户:);String name scanner.next();instruction logout name\ name \/;writer.println(instruction);writer.flush();} else if (choice 5) {System.out.println(等待接受消息中...);String response0 bufferedReader.readLine();String[] strings response0.split(\);String fromUser strings[7];String message strings[5];System.out.println(fromUser 说: message);continue;} else {instruction quit;writer.println(instruction);writer.flush();break;}String response bufferedReader.readLine();String[] strings response.split(\);String command strings[1];String state strings[3];if (command.equals(register)) {if (state.equals(ok)) {System.out.println(注册成功);} else {System.out.println(已存在该用户注册失败请重新注册);}} else if (command.equals(login)) {if (state.equals(ok)) {System.out.println(登陆成功);} else {System.out.println(该用户不存在(或重复登陆)请重新登录);}} else if (command.equals(logout)) {if (state.equals(ok)) {System.out.println(成功退出账户);} else {System.out.println(该账户不存在(未登录)请重试);}} else if (command.equals(message)) {if (state.equals(ok)) {System.out.println(成功发送消息);} else {System.out.println(您对话的用户不存在(未登录),请重试);}}}socket.close();System.out.println(---成功退出系统---);}
}package homework5.experiment2;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;public class Client02 {private static String user;public static void main(String[] args) throws IOException {System.out.println(————————欢迎来到魏乐天设计的聊天界面窗口————————);Socket socket new Socket(InetAddress.getByName(localhost), 8888);Scanner scanner new Scanner(System.in);while (true) {InputStreamReader reader new InputStreamReader(socket.getInputStream());PrintWriter writer new PrintWriter(socket.getOutputStream());BufferedReader bufferedReader new BufferedReader(reader);System.out.println(请选择您要进行的操作);System.out.println(1--注册用户);System.out.println(2--登陆账户);System.out.println(3--发送信息);System.out.println(4--登出账户);System.out.println(5--接收信息);System.out.println(其他数字--退出系统);int choice scanner.nextInt();String instruction ;if (choice 1) {System.out.print(请输入您想要注册的账户名称:);String name scanner.next();instruction register name\ name \/ ;writer.println(instruction);writer.flush();} else if (choice 2) {System.out.print(请输入您想要登录的账户名称:);user scanner.next();instruction login name\ user \/;writer.println(instruction);writer.flush();} else if (choice 3) {System.out.print(请输入您想要发送的用户名称:);String toUser scanner.next();System.out.println(toUser);System.out.println(你说:);String message scanner.next();System.out.println(message);instruction message from\ user \ to\ toUser \ message\ message \;System.out.println(instruction);writer.println(instruction);writer.flush();} else if (choice 4) {System.out.print(请输入您想要登出的账户:);String name scanner.next();instruction logout name\ name \/;writer.println(instruction);writer.flush();} else if (choice 5) {System.out.println(等待接受消息中...);String response0 bufferedReader.readLine();String[] strings response0.split(\);String fromUser strings[7];String message strings[5];System.out.println(fromUser 说: message);continue;} else {instruction quit;writer.println(instruction);writer.flush();break;}String response bufferedReader.readLine();String[] strings response.split(\);String command strings[1];String state strings[3];if (command.equals(register)) {if (state.equals(ok)) {System.out.println(注册成功);} else {System.out.println(已存在该用户注册失败请重新注册);}} else if (command.equals(login)) {if (state.equals(ok)) {System.out.println(登陆成功);} else {System.out.println(该用户不存在(或重复登陆)请重新登录);}} else if (command.equals(logout)) {if (state.equals(ok)) {System.out.println(成功退出账户);} else {System.out.println(该账户不存在(未登录)请重试);}} else if (command.equals(message)) {if (state.equals(ok)) {System.out.println(成功发送消息);} else {System.out.println(您对话的用户不存在(未登录),请重试);}}}socket.close();System.out.println(---成功退出系统---);}
}package homework5.experiment2;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;public class Client03 {private static String user;public static void main(String[] args) throws IOException {System.out.println(————————欢迎来到魏乐天设计的聊天界面窗口————————);Socket socket new Socket(InetAddress.getByName(localhost), 8888);Scanner scanner new Scanner(System.in);while (true) {InputStreamReader reader new InputStreamReader(socket.getInputStream());BufferedReader bufferedReader new BufferedReader(reader);PrintWriter writer new PrintWriter(socket.getOutputStream());System.out.println(请选择您要进行的操作);System.out.println(1--注册用户);System.out.println(2--登陆账户);System.out.println(3--发送信息);System.out.println(4--登出账户);System.out.println(5--接收信息);System.out.println(其他数字--退出系统);int choice scanner.nextInt();String instruction ;if (choice 1) {System.out.print(请输入您想要注册的账户名称:);String name scanner.next();instruction register name\ name \/ ;writer.println(instruction);writer.flush();} else if (choice 2) {System.out.print(请输入您想要登录的账户名称:);user scanner.next();instruction login name\ user \/;writer.println(instruction);writer.flush();} else if (choice 3) {System.out.print(请输入您想要发送的用户名称:);String toUser scanner.next();System.out.println(toUser);System.out.println(你说:);String message scanner.next();System.out.println(message);instruction message from\ user \ to\ toUser \ message\ message \;writer.println(instruction);writer.flush();} else if (choice 4) {System.out.print(请输入您想要登出的账户:);String name scanner.next();instruction logout name\ name \/;writer.println(instruction);writer.flush();} else if (choice 5) {System.out.println(等待接受消息中...);String response0 bufferedReader.readLine(); //当没有客户端发送消息时会在这里阻塞直到收到消息String[] strings response0.split(\);String fromUser strings[7];String message strings[5];System.out.println(fromUser 说: message);continue;} else {instruction quit;writer.println(instruction);writer.flush();break;}String response bufferedReader.readLine();String[] strings response.split(\);String command strings[1];String state strings[3];if (command.equals(register)) {if (state.equals(ok)) {System.out.println(注册成功);} else {System.out.println(已存在该用户注册失败请重新注册);}} else if (command.equals(login)) {if (state.equals(ok)) {System.out.println(登陆成功);} else {System.out.println(该用户不存在(或重复登陆)请重新登录);}} else if (command.equals(logout)) {if (state.equals(ok)) {System.out.println(成功退出账户);} else {System.out.println(该账户不存在(未登录)请重试);}} else if (command.equals(message)) {if (state.equals(ok)) {System.out.println(成功发送消息);} else {System.out.println(您对话的用户不存在(未登录),请重试);}}}socket.close();System.out.println(---成功退出系统---);}
}package homework5.experiment2;import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Hashtable;public class Server {//利用图存储用户的登录状态static HashtableString, Boolean user new Hashtable();//利用图存储用户登录的客户端static HashtableString, PrintWriter client new Hashtable();public static void main(String[] args) throws IOException {//服务器在本机8888端口进行监听等待连接ServerSocket serverSocket new ServerSocket(8888);System.out.println(服务器在本机8888端口进行监听等待连接...);while (true) {Socket socket serverSocket.accept();System.out.println(成功监听到客户端 socket.getPort());SocketHandler handler new SocketHandler(socket);Thread thread new Thread(handler);thread.start();}}
}
package homework5.experiment2;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;public class SocketHandler implements Runnable {private Socket socket;public SocketHandler(Socket socket) {this.socket socket;}Overridepublic void run() {try {InputStreamReader reader new InputStreamReader(socket.getInputStream());BufferedReader bufferedReader new BufferedReader(reader);PrintWriter writer new PrintWriter(socket.getOutputStream());PrintWriter toWriter null;while (true) {String request bufferedReader.readLine();if (request null) {continue;}String line ;String[] strings request.split(\);String name strings[1];if (request.startsWith(register)) {if (!Server.user.containsKey(name)) {Server.user.put(name, false);line result command\register\ state\ok\ /;} else {line result command\register\ state\error\ message\\ /;}writer.println(line);writer.flush();} else if (request.startsWith(login)) {if (Server.user.containsKey(name) !Server.user.get(name)) {line result command\login\ state\ok\ /;Server.user.put(name, true);Server.client.put(name, writer);} else {line result command\login\ state\error\ message\\/;}writer.println(line);writer.flush();} else if (request.startsWith(message)) {String toUser strings[3];String message strings[5];if (Server.user.containsKey(toUser) Server.user.get(toUser)) {toWriter Server.client.get(toUser);System.out.println(toUser);System.out.println(toWriter);line result command \message\ state\ok\ message \ message \ form \ name \/;toWriter.println(line);toWriter.flush();} else {line result command \message\ state\error\ message\\ /;}writer.println(line);writer.flush();} else if (request.startsWith(logout)) {if (Server.user.containsKey(name) Server.user.get(name)) {Server.user.put(name, true);line result command \logout\ state\ok\ /;} else {line result command\logout\ state\error\ message\\ /;}writer.println(line);writer.flush();break;}}//关闭相关流writer.close();toWriter.close();bufferedReader.close();socket.close();} catch (IOException e) {e.printStackTrace();}}
}