网络聊天室课程设计报告内附java代码_第1页
网络聊天室课程设计报告内附java代码_第2页
网络聊天室课程设计报告内附java代码_第3页
网络聊天室课程设计报告内附java代码_第4页
网络聊天室课程设计报告内附java代码_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-. z.课程设计网络聊天室院(系) 别 信电学院 班 级 计算102 学 号姓 名指导教师时 间2013-4-182013-5-10课 程 设 计 任 务 书题目网络聊天室 课程设计系 (部) 信电学院 专业 计算机科学与技术 班级 计算102 学生* 4月 18 日至 5 月 10 日共 4 周指导教师(签字) 系主任(签字) 年月日设计容及要求二、设计原始资料1电子工业JSP实用教程,阿奇编著2电子工业JAVA程序设计实用教程,叶核亚编著三、设计完成后提交的文件和图表1计算说明书局部JSP界面设计2图纸局部:程序流程图四、进程安排五、主要参考资料1电子工业JSP实用教程,阿奇编著2电子工

2、业JAVA程序设计实用教程,叶核亚编著考资料成 绩 评 定 表作品成绩报告成绩口试辩论成绩总评成绩-. z.目 录 TOC o 1-3 h z u HYPERLINK l _Toc14414 课程设计概述 PAGEREF _Toc14414 4 HYPERLINK l _Toc3582 1.1问题描述 PAGEREF _Toc3582 4 HYPERLINK l _Toc1895 1.2功能需求分析 PAGEREF _Toc1895 4 HYPERLINK l _Toc31148 1.3环境需求分析 PAGEREF _Toc31148 4 HYPERLINK l _Toc23951 学生信息管

3、理系统软件总体设计 PAGEREF _Toc23951 5 HYPERLINK l _Toc16195 2.1整体思路 PAGEREF _Toc16195 5 HYPERLINK l _Toc31166 2.2总体设计流程图 PAGEREF _Toc31166 6 HYPERLINK l _Toc21629 学生信息管理软件详细设计 PAGEREF _Toc21629 7 HYPERLINK l _Toc27361 3.1.界面设计 PAGEREF _Toc27361 7 HYPERLINK l _Toc9281 3.2通信功能实现方法 PAGEREF _Toc9281 9 HYPERLINK

4、 l _Toc28973 参考文献 PAGEREF _Toc28973 45-. z.课程设计概述1.1问题描述随着计算机网络日新月异的开展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。因此,两台计算机之间进展即时通讯、发送文件等交流方式已经成为必然潮流。因此出现了等聊天工具,然而等聊天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具。目前,用于实现单一的即时通讯、文件共享的软件实在太少,而且,它

5、们局部都是绝对的C/S模式,对远程效劳器有非常大的依赖性,没有彻底实现点对点的交流。为此,我决定开发一个专用于实现两台计算机之间即时通讯、文件共享的软件,以方便两台计算机之间信息的交流。防止了效劳器忙或与效劳器无法连接时,浪费过多时间用于和效劳器建立连接。因此,这个软件是极具适应性和实用性的即时通讯软件。1.2功能需求分析实现网络聊天的功能,采用WindowsSocket或JavaSocket编程,效劳器与客户端采用了TCP/IP连接方式,在设计聊天方案时,可将所有信息发往效劳器端,再由效劳器进展处理,效劳器端是所有信息的中心。效劳器端要保存用户信息,可利用数据库来实现这一功能,需要建立用户信

6、息数据库。在客户端可采用文件系统保存聊天纪录和用户。可通过闪动托盘图标和播放不同的音乐提示信息到来及好友上线等信息。可通过建立消息链表来保存用户接收的各种消息。1.3环境需求分析运行环境:Windows 9*、2000、*P、Windows 7必要环境:JDK 1.6以上、eclipse开发环境硬件环境:CPU 400MHz以上,存512MB以上学生信息管理系统软件总体设计2.1整体思路该C/S模式的聊天系统,就是效劳器来提供效劳端连接响应,客户端主动的发起连接请求。当多个用户同时连接到效劳器时,经由效劳器的接收与转发便可以实现客户之间的通信。对于整体系统的流程,也是分为两局部,即客户端的发起

7、请求,效劳器响应请求。首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的效劳器,然后客户端就会根据设置的效劳器IP地址,向效劳器发起建立连接请求。而效劳器端是始终在监听网络状态的,主要检测到有一个连接请求,则效劳器就会给当前的发起端分配一个效劳线程,用于处理它的各种请求。对于客户端的各种请求,实际上都是通过在客户发往效劳器的各种字符流区分的,具体的方法就是在消息的头部以及尾部添加特殊字符串,从而实现效劳器对消息请求的识别。比方对于登陆信息,消息的头部就是PEOPLO,而对于私聊中的消息,头部就是SEC,其他的同理都添加了头部。当然,对于客户端来说,这些都是透明的,用户的操作并没有受到任何

8、影响。在效劳器端,消息被检测分析后,变回根据具体的目的进展处理,比方是私聊消息,效劳器便会根据其尾部的目的信息,向目标端转发该条消息。这里额外要说的是,该系统特别的对用户发来的消息进展了加密处理,即用户的各种具体信息,不仅能够防止向第三方的泄漏,而且即使效劳器端出现异常,信息也不会泄漏。对于私聊的方式,该系统所采用的方法类似于QQ的通信方式,由发起方主动连接,当目的方接收到连接请求后,会主动建立一个私聊窗口,从而 实现私聊。2.2总体设计流程图ServerClient建立效劳器监听socket建立连接创立socket向效劳器发请求等待并接收连接请求接收请求后创立socket连接InputStr

9、eam开场通信InputStreamOutputStreamOutputStream关闭socket完毕通信关闭socket学生信息管理软件详细设计3.1.界面设计由于这里界面设计源代码比拟简单,这里不再列出。3.1.1 效劳器界面设计效劳器界面3.1.2客户端界面设计登陆界面注册界面聊天室界面3.2通信功能实现方法列举局部实现通信功能的主要代码AppServer.java文件publicclass AppServer e*tends Thread private ServerSocket serverSocket;private ServerFrame sFrame;privatestati

10、cVectoruserOnline = newVector(1, 1);privatestaticVectorv = newVector(1, 1);/* * 创立效劳器 启动效劳监听1001端口* */public AppServer() sFrame = new ServerFrame();try serverSocket = new ServerSocket(1001);/ 获取效劳器的主机名和IP地址InetAddress address = InetAddress.getLocalHost();sFrame.t*tServerName.setTe*t(address.getHostN

11、ame();sFrame.t*tIP.setTe*t(address.getHostAddress();sFrame.t*tPort.setTe*t(1001); catch (IOE*ception e) fail(e, 不能启动效劳!);sFrame.t*tStatus.setTe*t(已启动.);this.start(); / 启动线程/* * 退出效劳器 * * param e * 异常 * param str * 退出信息 */publicstaticvoid fail(E*ception e, String str) System.out.println(str + 。 + e);

12、/* * 监听客户的请求,当有用户请求时创立 Connection线程*/publicvoid run() try while (true) / 监听并承受客户的请求Socket client = serverSocket.accept();new Connection(sFrame, client, userOnline, v); / 支持多线程/ System.out.println(userLength:+userLength); catch (IOE*ception e) System.out.println(不能监听);/* * 启动效劳器 */publicstaticvoid ma

13、in(String args) new AppServer();ServerFrame.java文件publicclass ServerFrame e*tends JFrame implements ActionListener publicJListlist;/* * */privatestaticfinallongserialVersionUID = -20L;/ 效劳器信息面板JPanel pnlServer, pnlServerInfo;JLabel lblStatus, lblNumber, lblMa*, lblServerName, lblProtocol, lblIP,lblP

14、ort, lblLog;public JTe*tField t*tStatus, t*tNumber, t*tMa*, t*tServerName, t*tProtocol, t*tIP,t*tPort;utton btnStop, btnSaveLog;public Te*tArea taLog;JTabbedPane tpServer;public Te*tArea taMessage;/ 用户信息面板JPanel pnlUser;public JLabel lblMessage, lblUser, lblNotice, lblUserCount;JListlstUser;JScrollP

15、ane spUser;JTe*tField t*tNotice;utton btnSend, btnKick;public String ti = ;public String serverMessage =;public ServerFrame() / 效劳器窗口super(HappyChat聊天效劳器);setSize(550, 500);setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE);setResizable(false);Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();

16、/ 在屏幕居中显示Dimension fra = this.getSize();if (fra.width scr.width) fra.width = scr.width;if (fra.height scr.height) fra.height = scr.height;this.setLocation(scr.width - fra.width) / 2,(scr.height - fra.height) / 2);/ =效劳器信息面板=pnlServer = new JPanel();pnlServer.setLayout(null);pnlServerInfo = new JPane

17、l(new GridLayout(14, 1);pnlServerInfo.setBorder(BorderFactory.createpoundBorder(BorderFactory.createTitledBorder(), BorderFactory.createEmptyBorder(1, 1, 1, 1);lblStatus = new JLabel(当前状态:);t*tStatus = new JTe*tField(10);t*tStatus.setEditable(false);lblNumber = new JLabel(当前在线人数:);t*tNumber = new JT

18、e*tField(0 人, 10);t*tNumber.setEditable(false);lblMa* = new JLabel(最多在线人数:);t*tMa* = new JTe*tField(50 人, 10);t*tMa*.setEditable(false);lblServerName = new JLabel(效劳器名称:);t*tServerName = new JTe*tField(10);t*tServerName.setEditable(false);lblProtocol = new JLabel(访问协议:);t*tProtocol = new JTe*tField(

19、HTTP, 10);t*tProtocol.setEditable(false);lblIP = new JLabel(效劳器IP:);t*tIP = new JTe*tField(10);t*tIP.setEditable(false);lblPort = new JLabel(效劳器端口:);t*tPort = new JTe*tField(8000, 10);t*tPort.setEditable(false);btnStop = new utton(关闭效劳器(C);btnStop.addActionListener(new ActionListener() publicvoid ac

20、tionPerformed(ActionEvent arg0) closeServer(););lblLog = new JLabel(效劳器日志);taLog = new Te*tArea(20, 50);btnSaveLog = new utton(保存日志(S);btnSaveLog.addActionListener(new ActionListener() publicvoid actionPerformed(ActionEvent arg0) saveLog(););pnlServerInfo.add(lblStatus);pnlServerInfo.add(t*tStatus);

21、pnlServerInfo.add(lblNumber);pnlServerInfo.add(t*tNumber);pnlServerInfo.add(lblMa*);pnlServerInfo.add(t*tMa*);pnlServerInfo.add(lblServerName);pnlServerInfo.add(t*tServerName);pnlServerInfo.add(lblProtocol);pnlServerInfo.add(t*tProtocol);pnlServerInfo.add(lblIP);pnlServerInfo.add(t*tIP);pnlServerInf

22、o.add(lblPort);pnlServerInfo.add(t*tPort);pnlServerInfo.setBounds(5, 5, 100, 400);lblLog.setBounds(110, 5, 100, 30);taLog.setBounds(110, 35, 400, 370);btnStop.setBounds(200, 410, 120, 30);btnSaveLog.setBounds(320, 410, 120, 30);pnlServer.add(pnlServerInfo);pnlServer.add(lblLog);pnlServer.add(taLog);

23、pnlServer.add(btnStop);pnlServer.add(btnSaveLog);/ =在线用户面板=pnlUser = new JPanel();pnlUser.setLayout(null);lblMessage = new JLabel(用户消息);taMessage = new Te*tArea(20, 20);lblNotice = new JLabel(通知:);t*tNotice = new JTe*tField(20);btnSend = new utton(发送(S);btnSend.setEnabled(true);btnSend.addActionList

24、ener(new ActionListener() publicvoid actionPerformed(ActionEvent arg0) serverMessage(););lblUserCount = new JLabel(在线总人数 0 人);btnKick = new utton(踢人(K);btnKick.addActionListener(new ActionListener() publicvoid actionPerformed(ActionEvent arg0) tiRen(););lblUser = new JLabel(在线用户列表);lstUser = newJLis

25、t();lstUser.setVisibleRowCount(17);lstUser.setFi*edCellWidth(180);/指定的固定单元格宽度值,而不是从列表元素计算而来的宽度值lstUser.setFi*edCellHeight(18);spUser = new JScrollPane();spUser.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);spUser.getViewport().setView(lstUser);lblMessage.setBounds(5, 5, 100, 25);

26、taMessage.setBounds(5, 35, 300, 360);lblUser.setBounds(310, 5, 100, 25);spUser.setBounds(310, 35, 220, 360);lblNotice.setBounds(5, 410, 40, 25);t*tNotice.setBounds(50, 410, 160, 25);btnSend.setBounds(210, 410, 80, 25);lblUserCount.setBounds(320, 410, 100, 25);btnKick.setBounds(440, 410, 80, 25);pnlU

27、ser.add(lblMessage);pnlUser.add(taMessage);pnlUser.add(lblUser);pnlUser.add(spUser);list = newJList();list.setListData(new String );spUser.setViewportView(list);pnlUser.add(lblNotice);pnlUser.add(t*tNotice);pnlUser.add(btnSend);pnlUser.add(lblUserCount);pnlUser.add(btnKick);/ =主标签面板=tpServer = new J

28、TabbedPane(JTabbedPane.TOP);tpServer.add(效劳器管理, pnlServer);tpServer.add(用户信息管理, pnlUser);this.getContentPane().add(tpServer);setVisible(true);protectedvoid serverMessage() / TODO 自动生成方法存根this.serverMessage = t*tNotice.getTe*t();t*tNotice.setTe*t();protectedvoid closeServer() / TODO 自动生成方法存根this.disp

29、ose();/this.resprotectedvoid saveLog() / TODO 自动生成方法存根try FileOutputStream fileoutput = new FileOutputStream(log.t*t,true);String temp = taMessage.getTe*t();fileoutput.write(temp.getBytes();fileoutput.close();JOptionPane.showMessageDialog(null, 记录保存在log.t*t); catch (E*ception e) System.out.println(e

30、);protectedvoid tiRen() / TODO 自动生成方法存根ti = list.getSelectedValue().toString();log(Ti:+ti);privatevoid log(String string) / TODO 自动生成方法存根String newta = taMessage.getTe*t();newta += (n+string);taMessage.setTe*t(newta);publicvoid actionPerformed(ActionEvent evt) publicstaticvoid main(String args) new

31、ServerFrame();Connection.java文件publicclass Connection e*tends Thread /* * 与客户端通讯Socket */private Socket netClient;/* * 在线用户列表 */private Vector userOnline;/* * 聊天信息 */private Vector userChat;/* * 从客户到效劳器 输入流 */private ObjectInputStream fromClient;/* * 传到客户端 打印流 */private PrintStream toClient;/* * 注册用

32、户列表 */privatestaticVectorvList = newVector();/* * 临时对象 */private Object obj;/* * 效劳器日志窗体 */private ServerFrame sFrame;SuppressWarnings(unchecked)/* * 创立与客户端通讯*/public Connection(ServerFrame frame, Socket client, Vector u, Vector c) netClient = client;userOnline = u;userChat = c;sFrame = frame;try /

33、发生双向通信/ 检索客户输入fromClient = new ObjectInputStream(netClient.getInputStream();/ 效劳器写到客户toClient = new PrintStream(netClient.getOutputStream(); catch (IOE*ception e) try netClient.close(); catch (IOE*ception e1) System.out.println(不能建立流 + e1);return;this.start();/* * 处理与客户端的通讯线程 */publicvoid run() try

34、/ obj是Object类的对象obj = (Object) fromClient.readObject();if (obj.getClass().getName().equals(Customer) /serverLogin();serverLoginDB();if (obj.getClass().getName().equals(Register_Customer) /serverRegiste();serverRegisteDB();if (obj.getClass().getName().equals(Message) serverMessage();if (obj.getClass(

35、).getName().equals(Chat) serverChat();if (obj.getClass().getName().equals(E*it) serverE*it(); catch (IOE*ception e) System.out.println(e); catch (ClassNotFoundE*ception e1) System.out.println(读对象发生错误! + e1); finally try netClient.close(); catch (IOE*ception e) System.out.println(e);/* * * 登录处理 */Sup

36、pressWarnings(deprecation)publicvoid serverLogin() try Customer clientMessage2 = (Customer) obj;/ 读文件FileInputStream file3 = new FileInputStream(user.t*t);ObjectInputStream objInput1 = new ObjectInputStream(file3);vList = (Vector) objInput1.readObject();int find = 0; / 查找判断标志/ System.out.println(fin

37、d);for (int i = 0; i vList.size(); i+) Register_Customer reg = (Register_Customer) vList.elementAt(i);if (reg.custName.equals(clientMessage2.custName) find = 1;if (!reg.custPassword.equals(clientMessage2.custPassword) toClient.println(密码不正确);break; else / 判断是否已经登录int login_flag = 0;for (int a = 0; a

38、 = 50) toClient.println(登录人数过多,请稍候再试);break;if (login_flag = 0) clientMessage2.custHead = reg.head;/ getUserHeadByName(clientMessage2.custName);userOnline.addElement(clientMessage2);toClient.println(登录成功);Date t = new Date();log(用户 + clientMessage2.custName + 登录成功,+ 登录时间: + t.toLocaleString() + n);f

39、reshServerUserList();break; else toClient.println(该用户已登录); else continue;if (find = 0) toClient.println(没有这个用户,请先注册);file3.close();objInput1.close();fromClient.close(); catch (ClassNotFoundE*ception e) System.out.println(e); catch (IOE*ception e) System.out.println(e);/* * * 登录处理 * * throws E*ceptio

40、n */SuppressWarnings(deprecation)publicvoid serverLoginDB() try Customer clientMessage2 = (Customer) obj;String name = clientMessage2.custName;String pass = clientMessage2.custPassword;String sql = select * from yonghu where custName= + name + ;ResultSet rs = DB.e*ecuteQuery(sql);System.out.println(

41、sql: + sql);boolean login = false;String head=;while (rs.ne*t() String ps=rs.getString(custPassword).toString();System.out.println(ps:+ps+);System.out.println(pass:+pass+);if (ps.equals(pass.toString() login = true;System.out.println(logined:);System.out.println(pareTo:+ps.pareTo(pass);head=rs.getSt

42、ring(head);System.out.println(head:+rs.getString(head);System.out.println(login:+login);if (!login) toClient.println(密码不正确);return;/ 判断是否已经登录int login_flag = 0;for (int a = 0; a = 50) toClient.println(登录人数过多,请稍候再试);return;if (login_flag = 0) System.out.println(head:+head);clientMessage2.custHead =he

43、ad;/ getUserHeadByName(clientMessage2.custName);userOnline.addElement(clientMessage2);toClient.println(登录成功);Date t = new Date();log(用户 + clientMessage2.custName + 登录成功, + 登录时间:+ t.toLocaleString() + n);freshServerUserList();return; else toClient.println(该用户已登录);fromClient.close(); catch (E*ception

44、e) e.printStackTrace();/* * 刷新效劳器日志窗体在线列表 * */privatevoid freshServerUserList() String userList = new String50;Customer cus = null;for (int j = 0; j userOnline.size(); j+) cus = (Customer) userOnline.get(j);userListj = cus.custName;sFrame.list.setListData(userList);sFrame.t*tNumber.setTe*t( + userOn

45、line.size();sFrame.lblUserCount.setTe*t(当前在线人数: + userOnline.size();/ System.out.println(fresh ok);/* * 注册处理 */SuppressWarnings( unchecked, deprecation )publicvoid serverRegiste() try int flag = 0; / 是否重名判断标志Register_Customer clientMessage = (Register_Customer) obj;File fList = new File(user.t*t);if

46、 (fList.length() != 0)/ 判断是否是第一个注册用户ObjectInputStream objInput = new ObjectInputStream(new FileInputStream(fList);vList = (Vector) objInput.readObject();/ 判断是否有重名for (int i = 0; i vList.size(); i+) Register_Customer reg = (Register_Customer) vList.elementAt(i);if (reg.custName.equals(clientMessage.c

47、ustName) toClient.println(注册名重复,请另外选择);flag = 1;break; elseif (reg.custName.equals(所有人) toClient.println(制止使用此注册名,请另外选择);flag = 1;break;if (flag = 0) / 添加新注册用户vList.addElement(clientMessage);/ 将向量中的类写回文件FileOutputStream file = new FileOutputStream(fList);ObjectOutputStream objout = new ObjectOutputS

48、tream(file);objout.writeObject(vList);/ 发送注册成功信息toClient.println(clientMessage.custName + 注册成功);Date t = new Date();log(用户 + clientMessage.custName + 注册成功, + 注册时间:+ t.toLocaleString() + n);file.close();objout.close();fromClient.close(); catch (ClassNotFoundE*ception e) System.out.println(e); catch (

49、IOE*ception e) System.out.println(e);/* * 注册处理 */SuppressWarnings( unchecked, deprecation )publicvoid serverRegisteDB() try intflag = 0; / 是否重名判断标志Register_Customer clientMessage = (Register_Customer) obj;String sql = select * from yonghu where custName=+ clientMessage.custName + ;ResultSet rs = DB.

50、e*ecuteQuery(sql);System.out.println(sql: + sql);boolean reg = false;while (rs.ne*t() reg = true;ResultSetMetaData rsmd = rs.getMetaData();int numberOfColumns = rsmd.getColumnCount();for(int i=1;i=numberOfColumns;i+)String me=rsmd.getColumnName(i);String v=rs.getString(i);System.out.println(me+:+v);

51、System.out.println();System.out.println(reg:+reg);if (reg) toClient.println(注册名重复,请另外选择);return;if (clientMessage.custName.equals(所有人) toClient.println(制止使用此注册名,请另外选择);return;sql = insert into yonghu(custName,custPassword,age,se*,email,head) values(+ clientMessage.custName+ ,+ clientMessage.custPass

52、word+ ,+ clientMessage.age+ ,+ clientMessage.se*+ ,+ clientMessage.email+ , + clientMessage.head + );System.out.println(c:+sql);DB.e*ecuteUpdate(sql);toClient.println(clientMessage.custName + 注册成功);Date t = new Date();log(用户 + clientMessage.custName + 注册成功, + 注册时间:+ t.toLocaleString() + n);fromClien

53、t.close(); catch (E*ception e) e.printStackTrace();System.out.println(e);/* * 发送信息处理 */publicvoid serverMessage() try Message mess = new Message();mess.userOnLine = userOnline;mess.chat = userChat;mess.ti = sFrame.ti;mess.serverMessage = + sFrame.serverMessage;ObjectOutputStream outputstream = new O

54、bjectOutputStream(netClient.getOutputStream();outputstream.writeObject(Message) mess);netClient.close();outputstream.close(); catch (IOE*ception e) /* * 增加信息处理 */publicvoid serverChat() / 将接收到的对象值赋给聊天信息的序列化对象Chat cObj = new Chat();cObj = (Chat) obj;/ chenmincObj.chatMessage = WordFilter.filter(cObj.chatMessage);chatLog(cObj);/ 将聊天信息的序列化对象填加到保存聊天信息的矢量中user

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论