java局域网聊天系统.doc_第1页
java局域网聊天系统.doc_第2页
java局域网聊天系统.doc_第3页
java局域网聊天系统.doc_第4页
java局域网聊天系统.doc_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

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

文档简介

武汉长江工商学院-工学院项目名称: 局域网内及时通讯 系统设计 学生姓名: 0 学 号: 0 班 级: 0 指导教师: 0 2012年6月13日目 录1系统设计意义12需求分析22.1 套接字socket的设置22.2 UDP数据报22.3 登陆界面设计23 系统总体设计33.1 可行性分析33.2 主要需求分析33.3 开发软件和运行环境33.4 系统功能模块34 系统功能详细设计44.1 登陆界面实现44.2 在线用户界面实现64.3信息编辑界面设计74.4 点对点信息传输设计84.5 广播数据报设计105 系统性能测试125.1 登陆界面测试125.2 在线用户列表测试125.3 点对点聊天测试13总结15致谢16参考文献17 1系统设计意义近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,避免企业内部机密通过Internet泄露到外部。为了解决上述矛盾,人们提出了开发局域网聊天软件的构想,通过局域网聊天软件,企业员工可以随时的进行即时消息传递,召开网络会议等,有利于提高工作消息效率,同时又保护了企业内部信息的安全性。所以局域网内的通信也成为一种必不可少的趋势。 本系统采用基于Socket和UDP数据包的局域网通信工具的设计与实现的方法。基于Socket和UDP数据报的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。随着网络在当今社会的飞速发展,信息技术已经融入人们的生活与学习工作中。网络通信已经成为了人们生活中必不可少的一部分。尤其是对某些企业来说,企业不希望自己内部的消息在Internt上传输,以免被具有恶意的人员截获企业内部的消息,因此企业内部之间的通信也就成为了一种必不可少的通信。通过这个局域网聊天程序的制作也可以让我们对自己的专业有一个更加深刻的了解,同时也可以帮助我们将所学习的知识应用于该程序的开发与制作之中。02需求分析2.1 套接字socket的设置由于本程序是基于局域网内即时通信工具的聊天程序设计,所以套接字的设置是其中必不可少的一部分。在使用套接字的过程之中,其中最为重要的还是端口号的设置,由于是基于局域网内的即时通讯,所以本程序的设计思路是使用的点对点的聊天方式,因为点对点的聊天方式不需要借助于某一指定的服务器,所以维护起来更加的简单。套接字的设置主要为其中的端口号的设置,包括了两大部分的端口设置。(1)点对点通信端口设置在点对点的端口设置中时,各个用户都是使用的是相同的端口号,刚开始这样的设置就出现了一个问题,就是如果使用的是相同的端口号,只要有一个用户发送了消息,在本局域网中使用本程序的其他人都可以收到。所以为了解决这一问题,在发送消息时,首先将消息要发送的目的主机的IP地址也一起封装到数据报中了,当每个主机接受到此数据包时,然后再将信息解析出来,如果目的主机的IP地址与自己的IP地址相同则接受此消息,否则,丢弃该消息。这样就成功的实现了点对点之间的通信问题。(2)广播数据报的端口设置在广播数据报的端口设置时,刚开始是让运行本程序的主机加入到相同的广播组之中,然后在该广播组之中也是设置的是同一端口号,这样加入该广播组的所有主机都能够收到该广播域广播的消息。 2.2 UDP数据报UDP数据报在此程序中主要实现了两个功能:点对点的聊天和广播数据报。(1)点对点聊天中的UDP数据报在点对点中使用的UDP数据报主要是通过UDP协议,将从用户主机发出的消息传输到接受放的另一台主机之上。在这个消息的传送过程中,我是首先将目的主机的IP地址也一起的封装到要发送的数据报中,然后通过自己设置的端口号进行传送,当接受此数据报的主机号与封装在该数据报中的目的IP地址相同时,就说明,此消息是发送到该目的主机的,那么该主机就会接受此信息。(2)点对点中的广播数据报点对点中的广播数据报,主要设置了一个组播地址,即在该组播组之中的主机就能够接受到任意一台主机广播发出的消息。2.3 登陆界面设计登陆界面的设计主要是模仿qq登陆界面的设计的,界面中包含了用户名和密码以及登陆按钮和两张默认的图片。由于是基于局域网内的聊天,所以登陆界面中的密码和用户名都是本程序已经设定好了的默认的密码和用户名。03 系统总体设计3.1 可行性分析可行性分析法是对该程序进行系统技术经济论证,经济合理性综合分析的方法。其目的是通过对技术先进程度,经济合理性和条件可能性的分析论证,选择以最小的人力、物力、财力耗费,取得最佳技术、经济、社会效益的切实方案。它是解决系统投资前期分析的主要手段。本程序的可行性主要从技术可行性分析来考虑。此程序的制作软件主要使用了eclipse软件该软件无论是在操作上还是在执行的过程中都是非常的简单,及时是没有用过此软件的人,只要大致的看一编软件的运行过程就可以懂得如何去运用了,同时在编写程序的过程中也使用了一些java语言中的一些东西,如Socket编程,UDP数据报以及广播数据报。3.2 主要需求分析需求分析就是为了发现用户的真正需求,首先应该了解和分析用户所面临的问题,然后有针对性地对让用户在线学习。也就是要了解当前用户的情况和需要解决的问题。然后在针对这些问题,我们设计出来用户满意的局域网内的及时通讯工具。(1)点对点聊天本程序能够实现局域网内的点对点的聊天,只要用户在局域网内使用本程序,然后在列表上点击需要聊天的对象发送信息时,运行本程序的另外的一方就能够收到发送者送的消息。(2)在线人数的刷新本程序能够自动的刷新使用本程序的人数的列表。当有人使用此程序时,列表上就会刷新出来该用户,然后将其信息显示在列表上。(3)手动刷新列表此程序的主页面的下方有一个刷新的按钮,用户也可以按该按钮进行刷新在线的人数。(4)用户界面登陆本程序具有一个登录界面,登录界面中主要是然用户输入用户名和密码,用户名和密码都是程序自己设定的默认用户名和默认的密码(都为admin),当用户输入除这以外的用户名和密码时系统会自动的弹出一个提示的窗口进行提示用户,您输入的密码或者是用户名错误。3.3 开发软件和运行环境开发软件主要为:JDK1.6和eclipse运行环境:XP/Windows73.4 系统功能模块局域网聊天工具功能点对点聊天自动刷新手动刷新图2-1 系统模块图14 系统功能详细设计4.1 登陆界面实现登陆界面图如下:图4-1 登陆界面代码分析说明:该界面的编制过程中主要编写了两个方法。其中LogIn()方法是一个构造方法,里面的一些语句的功能就是主要是对窗体里面的一些组件的设置,如图片、标文本以及按钮的设置和它们在组件中位置的布局。public void actionPerformed(ActionEvent e)方法的主要功能就是实现对按钮的监听功能,即当用户输入了用户名和密码,点击登录按钮时,系统就会做出相应的反应。用户输入的密码或者是用户名有误时,系统会弹出一个提示对话框通知用户输入的密码或者是用户名有误。同时为了使登录界面美观,漂亮,本程序还在窗体之中添加了一张背景图片和一张图像图片,这样使得登录界面看起来更加的美观。4.2 在线用户界面实现主界面的编写也主要是使用了javax swing、java awt和java awt.event包中的一些函数。由于主界面中主要是显示在线用户的信息,所以主界面的编写就相对的简单,没有其它多余的东西来修饰。主界面中主要包含了3个组件:标签、列表、以及按钮。这些组件在窗体中的布局方式主要为:BorderLayout布局。在线用户列表图如下:图4-2 在线用户更新重要函数代码如下:A()tryaddress=InetAddress.getLocalHost();String ip=address.getHostAddress();list=new java.awt.List(25,false);list.add(ip);list.setVisible(true);catch(Exception ee)System.out.println(断点);labelOne=new JLabel(在线人数列表);b1=new JButton(刷新在线人数列表);labelTwo=new JLabel(双击昵称可以进行聊天);add(North,labelOne);add(Center,list);add(South,labelTwo);add(South,b1);g=new GroupReceive();g.thread.start();代码分析说明:A()方法也是一个构造方法,该方法里面包含的组件主要有标签(JLabel)、列表(List)、按钮(JButton)这三大组件,组件之间的布局方式采用的是BorderLayout布局。4.3图4-3 信息编辑界面代码分析说明:该代码中主要使用的组件为有标签(JLabel)、文本行(JTextField)、文本域(JTextArea)以及按钮(JButton)。组件之间的布局主要借用了中间容器作为过渡,然后再将这些组件分别加入到中间容器之中,然后中间容器的布局也是使用的是BorderLayout布局方式。4.4 点对点信息传输设计点对点的信息传输主要使用的是UDP数据,因为该程序是基于局域网内的无特定服务器的通讯,所以使用的是UDP数据报。UDP实现点对点信息的传输主要是基于包中的DatagramPacket类和DatagramSocket类对消息进行发送与接受。消息的发送过程中包含了将目的主机的IP地址也封装在该数据报之中的过程,消息的接受过程包含了将数据报解析的过程,解析之后消息就分为了两个部分,一个部分为目的主机的IP号,另一部分为真正的消息数据。接受数据的条件为,目的主机的IP师否与自己的IP相同,如果相同则接受信息,否则丢弃。流程图如下:用户1封装数据报解析数据报目的IP与主机IP比较接受消息用户2是否传输数据报丢弃发送数据报图4-4 点对点信息传输流程图重要函数代码如下:public void actionPerformed(ActionEvent e)/监听函数tryDate date=new Date();/获取本地时间SimpleDateFormat matter=new SimpleDateFormat(HH:mm:ss);/对时间格式进行处理InetAddress ad=InetAddress.getLocalHost();String adIp=ad.getHostAddress()/获取本地IP;String ss=text2.getText()+|+adIp+ +matter.format(date).toString()+n+text3.getText();byte b=ss.getBytes();InetAddress address=InetAddress.getByName(text2.getText();DatagramPacket data=new DatagramPacket(b,b.length,address,8006);DatagramSocket mail=new DatagramSocket();mail.send(data);/发送消息area.append(adIp+ +matter.format(date).toString()+n+text3.getText()+n);/向聊天域中添加消息text3.setText(null);/将发送域中的消息设置为空catch(Exception e1)System.out.println(断点1);public void run()String s=null;DatagramPacket pack=null;DatagramSocket mail=null;byte b=new byte8192;tryInetAddress add=InetAddress.getLocalHost(); String addIp=add.getHostAddress();pack=new DatagramPacket(b,b.length);mail=new DatagramSocket(8006);while(true)System.out.println(11111xiao);trymail.receive(pack);String message=new String(pack.getData(),0,pack.getLength();StringTokenizer fenxi=new StringTokenizer(message,|);String str1=fenxi.nextToken();String str2=fenxi.nextToken();System.out.println(str2);if(str1.equals(addIp)area.append(str2+n);catch(Exception ee)System.out.println(ee);catch(Exception ee1)System.out.println(ee1);/断点2代码分析说明:public void actionPerformed(ActionEvent e)函数主要是监听函数,即当用户点击聊天域中的发送按钮时,程序就会监测到,然后执行该函数,将用户要发送的消息进行一系列的封装处理,然后在进行传输。public void run()方法主要是实现消息的接受功能,即当进程开始运行时,接受功能就已经启动了,只要有用户发送消息到该主机,该主机首先会对消息进行一个处理,然后在进行接受。4.5 广播数据报设计广播数据报的发送类似于电台广播消息,主要的就是广播的数据报只有加入该广播组之后才能收到广播的信息。广播数据报函数代码如下:public void run()while(true)tryInetAddress address=InetAddress.getLocalHost();String ip=address.getHostAddress();byte data=ip.getBytes();DatagramPacket packet=new DatagramPacket(data,data.length,group,6000);socket.send(packet);sleep(1000);catch(Exception e1)System.out.println(断点2);接受广播数据报函数如下:public void run()while(true)byte data=new byte8192;DatagramPacket packet=null;packet=new DatagramPacket(data,data.length,group,port);trysocket.receive(packet);InetAddress add=InetAddress.getLocalHost();String receiveIp=/+add.getHostAddress().toString();System.out.println(本地+receiveIp);System.out.println(发送+packet.getAddress().toString();message=new String(packet.getData(),0,packet.getLength();if(message.equals(receiveIp)/接受的消息与本地IP比较message=null;System.out.println(收到+message);thread.sleep(1000);catch(Exception e1)System.out.println(断点4);代码分析说明:广播数据报主要起为了向该组中的其它用户广播自己的IP,所以接受广播消息时也使用了一条判断语句,就是但接受者的IP与广播数据报中的IP相同时,就丢弃该消息,否则就接受。广播数据报在此函数中的作用主要是为了更新在线用户列表。即当有用户使用此系统时,列表上的在线人数就会更新。55 系统性能测试5.1 登陆界面测试当用户运行本程序后,首先系统会自动的跳出一个像qq一样的登陆界面,测试图如下:由于本程序的用户名和密码是在系统内默认设置的,所以当用户的信息输入错误,系统也会给与相应的提示。 当输入正确的用户名和密码且点击登录按钮时,系统会提示用户登陆成功,测试图如下:图5-1(a)登陆测试图5-1(b)登陆测试5.2 在线用户列表测试点击确定后进入主界面,进入主界面后,主界面上的列表就会显示出局域网内当前所有使用该软件的人的IP。由于自动刷新功能有一个时间上的限制,有时候可能不能满足用户的需求,所以添加了一个手动刷新功能,点击刷新在线人数列表后,在此局域网内的所有使用此程序的所有人员都会被搜索出来,并且将他们的IP显示在该列表上。当用户点击自己的的昵称时,系统会自动的弹出一个相应的提示对话框,告诉用户此昵称为自己的昵称,且不能够和自己行进聊天。测试图如下:图5-2(a) 双击聊天图5-2(b)双击聊天5.3 点对点聊天测试当用户双击列表中的在线人时,就会弹出一个聊天窗口,可以进行点对点的聊天,双方聊天测试图如下:图5-3(a) 点对点聊天测试图5-3(b) 点对点聊天测试2总结通过这次的课程设计,使我学到了很多意想不到的收获,刚开始对编写这个局域网内的聊天程序基本上没有一点信心的,但是通过一个多星期的日夜奋斗,终于完成了这个课程设计的基本功能,虽然这个程序在一定的程度上还存在着一些的缺陷,不能像网上的聊天工具那样,功能不是很强大,没有发送文件、表情,以及不能修改字体的大小和颜色。但这也是我一个多星期为之奋斗而得到的结果,所以我对自己能够编写出来一个简单的点对点的聊天工具而感到欣喜,但也感到自己还有许多的不足之处,如对广播数据报的理解还不是很深刻,致使在编写刷新列表信息的时候,只能够刷新在线人数的列表,但对于已经下线的人的刷新功能还没能编写出来。总之,通过这个局域网聊天程序的设计与编写,让我可以将所学习的java知识与网络知识相结合起来,对于网络编程也有了一定的认识与理解。最为重要的是我觉的自己能够将这学期一来学到的一些知识应用到此次的课程设计之中。015致谢通过这次的课程设计使我对所学的Java知识有了更加深刻的了解,同时也对网络中的UDP协议有了一定的认识。同时在这次课程设计的过程中也遇到了很多的问题,比如在刚开始编写登陆界面时,关于怎么将图片弄到窗体中作为背景图片,以及作为背景图片之后如何将其它的一些组件添加到该背景图片之上等等一系列的问题都纠结了半天,最后通过同学的帮助和自己在网上查资料才慢慢的解决了这些问题,编写出来了一个自己认为还可以的登陆窗口界面。当然这次课程设计的制作中还存在着一些的缺陷,有些功能也不是很完善。但这次的课程设计确实给了我一种很深刻的感觉,那就是其实只要自己肯努力一切都有可能。这次课程设计中也遇到了不少的问题,在这过程之中感谢老师和同学的帮助。在此,我发自内心的向他们说一声:谢谢。0参考文献1 管贻生. Java 高级实用编程M . 北京:清华大学出版社,2004.12 谢希仁.计算机网络(第五版)M . 电子工业出版社 2011.123 耿祥义. ava 大学实用教程(第2版)M . 子工业出版社 2011.54 韩希义. 计算机网络基础. 第一版M . 北京:高等教育出版社,2004 5 徐敬东等.机网络. 第一版M . 北京:清华大学出版社,2002 6 沈辉等.计算机网络工程与实训M . 第一版. 北京:清华大学出版社,2002 7 褚建立等.计算机网络技术实用教程M . 第二版. 北京:电子工业出版社,2003 8 刘化君.计算机网络原理与技术(第一版.)M . 北京:电子工业出版社,20059 Bruce Eckel.Thinking in Java 4M .American:Prentice Hall PTR10 Oreilly.Java Servlet ProgrammingM .American:Sernni Yey源代码第一份import .*;public class Group extends ThreadInetAddress group=null;MulticastSocket socket=null;Group()trygroup=InetAddress.getByName();socket=new MulticastSocket(6000);socket.setTimeToLive(1);socket.joinGroup(group);catch(Exception e)System.out.println(断点1);public void run()while(true)tryInetAddress address=InetAddress.getLocalHost();String ip=address.getHostAddress();byte data=ip.getBytes();DatagramPacket packet=new DatagramPacket(data,data.length,group,6000);socket.send(packet);sleep(1000);catch(Exception e1)System.out.println(断点2);第二份import .*; class GroupReceive implements Runnable/public static void main(String args)public/*GroupReceive()super();Group g=new Group();g.start();thread.start();*/class Receive implements RunnableString message=null;A a;int port=6000;InetAddress group=null;MulticastSocket socket=null;Thread thread;GroupReceive()tryGroup g=new Group();g.start();thread=new Thread(this);/System.out.println(11111);group=InetAddress.getByName();socket=new MulticastSocket(port);/System.out.println(11111);socket.joinGroup(group);/thread.start();/thread.start();/System.out.println(11111);/try/thread.start();/catch(Exception ee)System.out.println(ee);catch(Exception e)System.out.println(断点3);public void run()while(true)byte data=new byte8192;DatagramPacket packet=null;packet=new DatagramPacket(data,data.length,group,port);try/a=new A();socket.receive(packet);InetAddress add=InetAddress.getLocalHost();String receiveIp=/+add.getHostAddress().toString();System.out.println(本地+receiveIp);System.out.println(发送+packet.getAddress().toString();message=new String(packet.getData(),0,packet.getLength();/System.out.println(receiveIp.equals(packet.getAddress().toString();if(message.equals(receiveIp)message=null;/message=new String(packet.getData(),0,packet.getLength();System.out.println(收到+message);thread.sleep(1000);/*trycatch(InterruptedException ee2)*/sleep(2000);/sleep(1000);/a.list.add(s);/System.out.println(2222);/*for(int i=0;ia.list.getItemCount();i+)System.out.println(11111);System.out.println(a.list. getItem(i).toString();if(!a.list. getItem(i).toString().equals(s)a.list.add(s);/System.out.println(a.list.getItemCount();/System.out.println(3333);/System.out.println(a.list. getItem(i).toString();/System.out.println(4444);*/System.out.println(s);catch(Exception e1)System.out.println(断点4);第三份import java.awt.*;import java.awt.event.*;import .*;import java.util.Date;import java.text.SimpleDateFormat;import javax.swing.*;import java.util.*;/*public class PtoP public static void main(String args)new B(xiao,6);/4/42*/class B public class PtoP extends JFrame implements ActionListener,RunnableJLabel labelOne,labelTwo,labelThree;JTextField text1,text2,text3;JTextArea area;JButton b;Panel pane1,pane2,pane3;/A a; PtoP(String name,String ip)setTitle(qq对话框);setBounds(400,200,400,320);this.setResizable(false);pane1=new Panel();pane2=new Panel();pane3=new Panel();labelOne=new JLabel(昵称);text1=new JTextField(12);text1.setText(name);labelTwo=new JLabel(IP);text2=new JTextField(12);text2.setText(ip);text1.setEditable(false);text2.setEditable(false);pane1.add(labelOne);pane1.add(text1);pane1.add(labelTwo);pane1.add(text2);area=new JTextArea(10,30);area.setEditable(false);pane2.add(new JScrollPane(area);labelThree=new JLabel(发送的话);text3=new JTextField(20);b=new JButton(发送);b.addActionListener(this);pane3.add(labelThree);pane3.add(text3);pane3.add(b);/b.addActionListener(this);add(North,pane1);add(Center,pane2);add(South,pane3);/setVisible(true);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);validate();Thread thread=new Thread(this);thread.start();public void actionPerformed(ActionEvent e)tryDate date=new Date();SimpleDateFormat matter=new SimpleDateFormat(HH:mm:ss);InetAddress ad=InetAddress.getLocalHost();String adIp=ad.getHostAddress();String ss=text2.getText()+|+adIp+ +matter.format(date).toString()+n+text3.getText();byte b=ss.getBytes();InetAddress address=InetAddress.getByName(text2.getText();DatagramPacket data=new DatagramPacket(b,b.length,address,8006);DatagramSocket mail=new DatagramSocket();mail.send(data);/StringTokenizer fenxi=new StringTokenizer(ss,|);/for(int i=0;fenxi.hasMoreTokens();i+)/String str=fenxi.area.append(adIp+ +matter.format(date).toString()+n+text3.getText()+n);text3.setText(null);catch(Exception e1)System.out.println(断点1);public void run()String s=null;DatagramPacket pack=null;DatagramSocket mail=null;byte b=new byte8192;/InetAddress ad=InetAddress.getLocalHost();tryInetAddress add=InetAddress.getLocalHost();System.out.println(add.getHostAddress();String addIp=add.getHostAddress();System.out.println(addIp);/s= add.toString();pack=new DatagramPacket(b,b.length);mail=new DatagramSocket(8006);System.out.println(999+addIp);while(true)System.out.println(11111xiao);trymail.receive(pack);System.out.println(pack.getAddress();System.out.println(addIp);String message=new String(pack.getData(),0,pack.getLength();StringTokenizer fenxi=new StringTokenizer(message,|);String str1=fenxi.nextToken();System.out.println(str1);String str2=fenxi.nextToken();System.out.println(str2);if(str1.equals(addIp)area.append(str2+n);/if()catch(Exception ee)System.out.println(ee);catch(Exception ee1)System.out.println(ee1);/断点2第四份import java.awt.*;import java.awt.event.*;import javax.swing.*;import .*;public class ToLand public static void main(String args) LogIn log=new LogIn();class LogIn extends JFrame implements ActionListenerprivate JPanel pan;private JLabel labelName;private JLabel labelPassword;private JButton button;private JTextField text;private JPasswordField password;private JLabel label;private JLabel labelImage;private ImageIcon imageBackground,image;private String str,str1;LogIn()setTitle(登陆界面);this.setResizable(false);pan=new JPanel();str=bin/image/qq.jpg; /kechengsheji/my/bin/qq.jpg;/F:dongmanqq.jpgstr1=bin/image/Like.jpg;/F:dongmanLike.jpgimageBackground=new ImageIcon(str1);imageBackground.setImage(imageBackground.getImage().getScaledInstance(376,283,Image.SCALE_DEFAULT);image=new ImageIcon(str);image.setImage(image.getImage().getScaledInstance(87,92,Image.SCALE_DEFAULT);labelName=new JLabel(用户名);labelPassword=new JLabel(密 码);text=new JTextField(16);password=new JPasswordField(16);button=new JButton(登陆);label=new JLabel(imageBackground);labelImage=new JLabel(image);labelImage.setBounds(18,80,87,86);labelName.setBounds(120,90,50,20);text.setBounds(170,90,140,24);labelPassword.setBounds(120,120,50,20);password.setBounds(170,120,140,24);button.setBounds(270,190,60

温馨提示

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

评论

0/150

提交评论