计算机网络课设点对点聊天[苍松教学]_第1页
计算机网络课设点对点聊天[苍松教学]_第2页
计算机网络课设点对点聊天[苍松教学]_第3页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机网络课程设计说明书(点对点聊天程序)学 院: 计算机与信息科学学院 学生姓名: 专 业:软件工程班 级:1401班完成时间:2016年12月 摘 要目前即时通讯软件在平时的生活中有着十分广泛的应用,但是对绝大部分的软件来说,都必须得应用在互联网上,必须在一个Internel环境下才能使用。有的时候单位内部的员工,同学,可能没有互联网环境或者其他的原因希望不用上Internet就可以进行通讯,这样开发局域网通讯程序就有了必要性。本文提出了局域网通讯软件的需求,并详细对网络协议TCP/IP协议族进行了介绍和研究,如TCP,UDP,广播,IP等相关的技术。并对网络通讯原理进行了说明,采用了Cl

2、ient/Server模型, 程序基于TCP协议,通过socket接口来实现局域网内的即时通信工功能即聊天的功能。服务器端的一个端口用来监听对服务的请求,另外有一个临时端口用来给客户端发送数据,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。该软件采用多线程技术支持多用户操作,能够帮助企业在局域网内搭建起自己的聊天系统。避免了必须的经过互联网的过程。经过测试,程序能够有效达到基本的预期要求关键词 课程设计;计算机;TCP/IP协议;服务器/客户端;JAVA;教育专业b引言近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企

3、业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服

4、务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐

5、能力低,易于编程实现等优点。基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。目录1设计原理基础21.1 TCP/IP简介21.1.1 TCP/IP概念21.1.2 TCP:传输控制协议31.1.3 TCP连接建立与终止31.2 IP:网际协议41.3 UDP:用户数据报协议51.4 Socket网络编程原理62设计方法及思路72.1 思路72.2编程方法73系统需求分析与概要设计93.1功能需求分析93.4运行需求分析104.程序源码104.1接收消息104.2监听134.3发送消息14

6、4.5运行结果174.5.1 发送消息174.5.2 接收消息174.5.3 群发184.5.4 退出系统195出现问题及解决方法196 课程设计的总结体会206.1总结206.2展望21参考文献22致谢231设计原理基础1.1 TCP/IP简介1.1.1 TCP/IP概念首先网络协议一般是通过分不同的level进行开发的,每一层都有自己的通信功能。对于某一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统,如图所示。图1 TCP/IP结构如图所示,每个level都有不同工作:1)链路层,也称为数据链路层或网络接口层,通常包括PC机自身的网络

7、接口卡和本机操作系统中的设备驱动程序,用来处理相关的物理接口。2)网络层,也被称为互联网层,通常用于处理网络活动中的分组活动,例如分组的选路。在协议族中,如图所示,网络层协议主要包括了3个重要的协议。3)传输层,其目的主要是为通过网络相连的两台主机的应用程序间提供end-to-end的通信。在TCP/IP协议族中,有两个主要的且互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。其中,TCP是提供高可靠性的数据通信。它可以通过三次握手,超时设置等机制来有效地保证了数据传输的可靠性。而另外一个协议,UDP则为应用层提供一种相对要简单些的服务。它的工作只是把数据分组从发送方传输到

8、接收方,但是数据分组能否成功达到接收方它不会给予保证。如果需要可靠性就必须得通过其他层来完成。4)应用层,主要同于上层的应用程序进行的操作。1.1.2 TCP:传输控制协议TCP提供的是一种有保障的服务。确保了传输的可靠性,运用TCP协议的主机在交换数据之前必须首先建立一个连接。TCP主要是利用下面的步骤来确保其服务的:1)首先在应用程序产生TCP报文时会进行大小控制,根据算法决定的发送的数据块大小。然后再进行发送。2)当主机利用发出一个数据段之后,它会启动一个定时机制,如果在规定的时间内接收不到确认数据,发送方就会重发。3)TCP的一端收到另一端发送来的数据时,它将发送一个确认。4)TCP还

9、有头部检测。工作是检测数据在传输过程中是否发生改变。如果存在改变,那么TCP将丢弃这个报文段并且不会发送收到这个报文段的确认。5)IP数据报的顺次在传输过程中可能会发生改变,所以TCP将对收到的数据进行重新排序,将收到的数据重新排列以后再交给应用层处理。6)TCP的接收端会丢弃重复的数据。7)TCP还提供控制传输数据大小的机制。如利用滑动窗口机制来控制发送和接收数据的大小。1.1.3 TCP连接建立与终止建立连接(如图2):1)一方首先发送一个连接申请。2)接收方发回包含服务器的初始序号的应答。同时,也发送一个收到客户方报文的一个确认。3)发送申请方接收到接收方的确认序号,建立连接。这个过程就

10、是建立TCP连接的“三次握手”过程。连接终止(如图2):1)提出终止的一方首先发送了一个终止连接的申请。2)当接收方收到这个请求,会发送一个确认,再发送文件终止标志。3)然后这个接收方程序结束连接,此时也会发送一个结束标志和确认。图二三次握手与四次挥手1.2 IP:网际协议IP协议是TCP/IP协议族中最为重要的协议。所有的其他协议产生的数据都需要以IP数据报形式来进行发送传输。而且IP提供无连接、不可靠的数据报传送服务:1)IP协议不能保证IP数据报能成功地传输到接收方。如果发生某种错误时,如某个路由器暂时处于阻塞状态,IP也有一个简单的错误处理算法:丢弃数据,再通过发送一个特定的消息报给发

11、送端,发送端接收到之后再进行处理。2)IP在发送数据报之后就不在关心次数据报的状态信息。每个数据报的处理是相互独立的。IP地址分类如下图所示:图三IP地址分类1.3 UDP:用户数据报协议UDP是一个面向数据报的传输层协议:进程的每个输出都会被封装成一个UDP数据报,并组装成一份待发送的IP数据报。UDP不提供可靠性:其会把应用程序传给IP层的数据发送出去,它们能否达到目的地协议并不能保证。应用程序必须关心IP数据报的长度。如果它超过网络的MTU,那么就需要对IP数据报进行分片。1.4 Socket网络编程原理通常套接口分类:原始socket,流式socket和数据报socket.流式sock

12、et确保无差错无重复的顺序的数据传送.数据报socket定义了一种无连接的服务,传输数据时相互独立,无序的,也不确保可靠性.原始socket主要用于其他的网络协议实现的测试等。无连接设计时,服务器方通常都是在等待客户机发来信息,一有信息到来就开始进行处理,不需要先进行连接。其程序的流程可以用图四表示。图四2设计方法及思路2.1 思路客户端与服务器建立连接,连接是通过申请的套接字实现的,客户打开一个套接字并把它约束在一个端口上如果成功就相当于建立一个虚拟文件以后就可以在虚拟文件上写数据并通过网络向外传送,完成连接后就可以通信了。客户机向服务器发送请求,打开一个连接后,客户机把请求消息送到服务器的

13、停留端口上,完成提出请求操作。服务器在处理完客户的请求之后,要向客户机发送响应消息。客户通过关闭套接字来结束TCP/IP对话。当使用TCP/IP协议发送客户服务器服务程序时,服务器需要等待任意数量客户端的连接,以便为他们提供服务。客户端连接服务器时,必须先知道服务器的名称。在TCP/IP中,就是服务器的IP地址和端口号。bind()函数实现将服务器绑定到一个已知的名字上的功能。接下来要将服务器套接字设置为监听状态,这是通过listen()函数完成的。在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求。服务器与客户端完成连接后,就可以进行数据通信了。

14、 对于客户端来说,首先调用connect()函数向服务器发出连接请求。如果服务器接受了该请求接下来就可以与服务器通信了。2.2编程方法WinSocket通信的步骤:1.在服务器端的应用程序中的网络通信的步骤如下:(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接,再继续进入监听状态。(3)在监听的过程中,如果有用户发出了请求,则服务器会产生一个新的连接Socket来处理用户的请求,而原来的Socket仍然会进行监听操作。(4) 当完成通信后,服务器关闭与客户端的Socket连接。2.在客

15、户端应用程序中的网络通信的步骤如下:(1)建立一个客户端的Socket。(2)从命令行中得到服务器的名字,并进行查询以得到服务器的IP地址;(3)从命令行中得到服务器所提供的端口号,以便进行下一步的操作;(4)发送连接请求到服务器,并等待服务器的回馈信息。(5)连接成功后,与服务器进行数据的交互。(6)数据处理完毕后,关闭自身的Socket连接,释放进行连接所分配的资源,客户端的程序运行完毕。图五其主要工作流程为:服务器方首先创建一个socket,再调用绑定函数将该socket和本地网络地址绑定,然后调用监听函数对socket进行侦听同时也规定其处理大小,之后就调用接收函数来接收连接。客户端在

16、建立套接口后就可调用连接函数和申请和服务器建立连接.在服务器接收申请后建立连接,然后客户机和服务器之间就可以发送和接收数据.最后,待数据传送结束后,关闭socket.2.3.3C/S模型介绍。C/S模型一般是基于连接的来交换信息的.它通常是由两部分组成:1)Server服务器方一般都是在等待客户方的申请,建立connect后再进行通信。2)Client客户方会给一个已知的服务器方发送一个connect申请,当服务器端接收请求之后connect成功。3系统需求分析与概要设计3.1功能需求分析(1)用户端之间的信息发送,本程序需要实现的最基本的功能。用户在界面上可以将自己需要发送的信息填入相应的对

17、话框中,点击发送按钮后,可以将信息正常的发送给相应的其它用户,这个过程中的客户端与客户端之间使用点对点发送信息,预计利用TCP/IP协议中的UDP协议,在本程序中共需要3个端口,此功能预计使用3号端口。(2)在线用户主机IP列表的维护。在用户发送信息之前,需要选择相应的目的地端IP,这也就需要客户端拥有在线用户主机的IP地址,这个在线主机列表的维护是需要客户端定时自动向服务器端发送信息,服务器端收集并维护在线用户列表,再发送回客户端。需要在客户端和服务器端都使用定时器来完成此功能。此功能预计使用1、2号端口。(3)在C/S模式中,服务器与客户端是相互依赖的。在客户端启用以后,需要查看服务器端是

18、否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。3.2 数据需求分析(1)客户端之间聊天信息。在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。(2)在线用户聊天信息。服务器端存放在适当的空间中,在发送给客户端时,对信息列表进行格式化,便于客户端提取信息。(3)客户端向服务器端发送的确认在线信息。包括客户端刚刚启动时的初始化信息和

19、在使用过程中的确认在线信息。(4)其它程序内部可能需要设计的数据结构体3.3性能需求分析(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。(2)宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。(3)开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清

20、晰的理解整个系统的设计思路和实现细节。(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。3.4运行需求分析(1) 用户界面程序较小,启动速度快。可在网络中使用,有注册功能,需进行用户登录。启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。(2)故障处理在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。4.程序源码4.1接收消息Display display = Display.getDefault();createContents();t=new Threa

21、d(new Task(new MyNotify()Overridepublicvoid notifyResult(Object obj) tr=(TalkResult) obj;Display.getDefault().asyncExec(new Runnable() Overridepublicvoid run() text.append(tr.inetAddress+对我说:rn+tr.content+rn+new Date()+rn);text.append(=);/TODO:将这个地址存到集合中(不允许重复), hashsethashSet.add(tr.inetAddress);/将

22、hashset中的数据显示到table中去table.removeAll();for( InetAddress a:hashSet)TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new String a.getHostAddress();if( button_1.getSelection()=true)String ip=tr.inetAddress.getHostAddress();String content=UUID.randomUUID().toString();byte bs=content.getBytes();/将要

23、发送的内容转成字节数组intlength=bs.length ;/要发送的内容的字节数组的长度DatagramPacket dp=null;try InetSocketAddress addr=new InetSocketAddress( ip,Task.receivePort);dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(7890);ds.send(dp); catch ( Exception e) e.printStackTrace();finallyds.close();););t.setDaemon(true

24、);t.start();Thread t2=new Thread( new ReceiveEixtMsgTask( new MyNotify() Overridepublicvoid notifyResult(Object obj) TalkResult tr=(TalkResult) obj;InetAddress ia=tr.inetAddress;hashSet.remove( ia);Display.getDefault().syncExec(new Runnable() Overridepublicvoid run() table.removeAll();for( InetAddre

25、ss a:hashSet)TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new String a.getHostAddress();););t2.setDaemon(true);t2.start();shell.open();shell.layout();while (!shell.isDisposed() if (!display.readAndDispatch() display.sleep();4.2监听/选择ip 发送消息table.addSelectionListener(new SelectionAdapter() O

26、verridepublicvoid widgetSelected(SelectionEvent e) TableItem tis=table.getSelection();if( tis=null | tis.length=0)return;TableItem ti=tis0;String ip=ti.getText();text_2.setText(ip););/退出button_2.addSelectionListener(new SelectionAdapter() Overridepublicvoid widgetSelected(SelectionEvent e) MessageBo

27、x mb=new MessageBox(shell,SWT.OK|SWT.CANCEL); /32/mb.setMessage(是否退出?);intr=mb.open();if( r=32)intmyport=Integer.parseInt( text_3.getText();byte bs=bye.getBytes();intlength=bs.length;for( InetAddress a:hashSet)String ip=a.getHostAddress();DatagramSocket ds=null;try InetSocketAddress addr=new InetSoc

28、ketAddress( ip,ITalks3.EXITPORT);dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myport);ds.send(dp); catch ( Exception el) el.printStackTrace();finallyds.close();System.exit(0););4.3发送消息/发送btnNewButton.addSelectionListener(new SelectionAdapter() Overridepublicvoid widgetSelected(Select

29、ionEvent e) String s=text_1.getText();/内容intmyPort=Integer.parseInt(text_3.getText();/发送端口DatagramSocket ds=null;byte bs=s.getBytes();/将要发送的内容转成字节数组intlength=bs.length ;/要发送的内容的字节数组的长度if(button.getSelection()=true)for( InetAddress a:hashSet)String ip=a.getHostAddress();/DatagramPacket的构造方法参数,三个参: 最后

30、一个参数表示另外一台机器的地址和端口/UDP中的每一个包都必须指明要发送的地址try InetSocketAddress addr=new InetSocketAddress( ip,receivePort);DatagramPacket dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myPort);/使用本机上的哪一个端口发送ds.send(dp); catch (Exception e1) e1.printStackTrace(); finallyds.close();elseString ip=text_2.ge

31、tText();/对方ip/DatagramPacket的构造方法参数,三个参: 最后一个参数表示另外一台机器的地址和端口/UDP中的每一个包都必须指明要发送的地址try InetSocketAddress addr=new InetSocketAddress( ip,receivePort);DatagramPacket dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myPort);/使用本机上的哪一个端口发送ds.send(dp); catch (Exception e1) e1.printStackTrace()

32、; finallyds.close(););privateintreceivePort=10002;/接收用端口privatebyte buf;/接收用的字节数组private DatagramPacket dp;/Packetprivate DatagramSocket ds;/Socketprivate HashSethashSet=new HashSet();Overridepublicvoid run() /int port=Integer.parseInt(text_1.getText();buf= newbyte1024;/字节数组,用来缓存数据dp=new DatagramPac

33、ket(buf, buf.length);/构建一个数据包对象try ds=new DatagramSocket(receivePort);/构建一个数据包Socket,占用UDP的9999端口,进行接收while(true)ds.receive(dp);/用这个9999端口来接收数据,存在dp数据包对象的buf缓存空间System.out.println( new String(buf,0,dp.getLength();/将字节数组转成字符串输出Display.getDefault().asyncExec(new Runnable() Overridepublicvoid run() Str

34、ing s=new String(buf, 0, dp.getLength();/dp.getLength()接收的实际长度InetAddress address=dp.getAddress();text.append(address+对我说:rn+s+rn+new Date()+rn);text.append(=);/TODO:将这个地址存到集合中(不允许重复), hashsethashSet.add(address);/将hashset中的数据显示到table中去table.removeAll();for( InetAddress a:hashSet)TableItem ti=new Ta

35、bleItem(table, SWT.NONE);ti.setText(new String a.getHostAddress();); catch (Exception e) e.printStackTrace(); 4.5运行结果4.5.1 发送消息测试中本机ip为192.168.14.134,对方ip为 192.168.14.134,本机向对方发送:“这是测试”对方接收到消息,并且将本机ip加入到在线列表用户中4.5.2 接收消息测试中本机ip为192.168.14.134,对方ip为 192.168.14.134,对方向本机发送:“hello”,本机收到消息,并将对方加入到了在线列表中

36、4.5.3 群发选中群发,然后发送消息,显示再列表中的用户将都会收到相同的消息4.5.4 退出系统按退出按钮,用户将消失在在线用户列表中5出现问题及解决方法1、 在建立Socket连接时,两端的端口号必须设为一致,否则无法建立连接。 2、 建立好连接之后,必须按照给定的格式输入通信信息,即m+输入的信息内容,否则,将会出现“no this command”的提示。 3、 如果一个使用某端口的程序没有关闭,另一个程序就不能使用这个端口。 4、 必须先连接服务器端,再连接客户端,否则,不能预期将服务器端和客户端连通。6 课程设计的总结体会6.1总结课程设计终于完成了。在这段不长的时间里,我感触很深

37、,也学到很多东西。我对winsock双机通信有了更深的了解和认识,其原理和功能也加深了理解。TCP协议我们以前也学过相关知识,经过这次设计,相关的知识得到进一步巩固,运用也变得更加熟练。我学习和了解了有关JAVA中的相关知识和应用,JAVA开发环境也更加熟悉。通过这次课程设计,我不仅学习到了新的知识,也对以前学过的相关的知识有了更深入的理解和掌握。不仅加强了我的理论知识的学习,也增强了我的动手能力,对知识的理解不再局限于表明,理解更加透彻,也更巩固。以前的学习都是单一方面的知识,这次通过课程设计,将这三个方面的知识综合起来,显然难度是加大了。开始的时候我也感觉似乎无从下手。但在网上查找了相关资

38、料,并且请教了一些同学后,有了一些头绪,并着手开始设计和实践。我们组这次做的课题的目的就是通过套接字在客户端和服务器之间建立连接,这个连接是以TCP协议传输。在建立连接之后实现客户端与服务器之间的通信,从而设计相关函数的调用和对套接字的应用。1、客户连接(Clientconnections)由客户启动,并将本地客户套接字与远程服务器套接字相连.客户套接字必须说明它们想连接的服务器.需要提供服务器的主机名或IP地址及其端口号.2、监听连接(ListeningConnections)是等待客户的被动服务器套接字连接.一旦客户发出了新的请求,服务器就会为该特殊连接生成新的套接字,然后返回监听状态.监

39、听服务器套接字必须说明代表其提供服务的端口吗(事实上,客户正是通过该端口进行连接的).3、服务器连接是由服务器激活的连接,负责接受来自客户的请求.这些不同的连接种类只对建立客户与服务器之间的连接具有重要性.一旦连接建立完毕.连接的双方都可以自由发出请求并彼此发送数据.这里面涉及什么是套接字,什么是流式套接字,为什么用流式套接字等问题。用套接字中的相关函数来完成通信过程,它的存在是为了区别不同应用程序进程间的网络通信和连接。流套接字用于提供面向连接、可靠的数据传输服务,又因为该服务将保证数据能够实现无差错、无重复发送,并按顺序接收,所以用了流式套接字。6.2展望通过设计实现和测试的数据表明,本文研究的局域网即时通信方法能有效地完成局域网之间的通信,但随着技术的发展,系统中还存在许多不足的地方,有待进一步改进和完善。同时,即时通信技术也在不断的提高,这迫切的需要新的技术和方法。在今后的研究过程中,还要注意以下几个方面的工作:1)对网络通信技术的研究。正如我们所知道的,网络通信技术在建立在网络通信协议的基础上的。尤其是对TCP/IP协议族的研究,或者将来会出现更加有效安全的网络协议,这个方向一直

温馨提示

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

最新文档

评论

0/150

提交评论