开发QQ聊天程序详解.doc_第1页
开发QQ聊天程序详解.doc_第2页
开发QQ聊天程序详解.doc_第3页
开发QQ聊天程序详解.doc_第4页
开发QQ聊天程序详解.doc_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第1天概述31.1程序31.2学习编程语言31.3为什么Java不是我发明的31.4准备学习这本书的开发环境3第2天 Java GUI开发I画个王八和满天星斗3第3天 线程I下大雪3第4天 java事件处理一个小游戏的开发3第5天 Java GUI开发II实现自己的计算器3第6天 Java GUI开发III开始即时聊天项目4第7天 高级I/O流编程聊天记录18第9天 网络编程用户身份验证和通讯25第10天 JDBC数据库处理数据库验证33第11天 线程处理多个用户登陆41第12天 集合处理信息转发55第1天 概述1.1程序软件开发就是用一堆程序来满足用户的需求,什么是程序?其实程序并不是计算机里面的概念,在生活中到处都是程序。比如,我说你看完我的书记得把它合上放到书架上,然后关上你的电脑,上床睡觉。如果这个过程我说一句你做一句,那么我说的就叫“命令”。我们平时就是用“命令”和计算机交流。如果刚才那个过程,我是写在纸上交给了你,那么纸上写的就是“程序”了。而这个例子是讲人比作了计算机,但是计算机不会像人那么聪明,它不会理解汉语,所以1.2学习编程语言1.3为什么Java不是我发明的1.4准备学习所用的开发环境第2天 Java GUI开发I画个王八和满天星斗我们先来做一个窗体,把程序的框架描述出来的:public class Test public static void main(String agrs) 注意Java程序是关心大小写的,我们从第一行看,public和class千万不能写错,他们是Java的关键字,就是最重要的单词,不要错了呀!Test是你程序的名字第3天 线程I下大雪第4天 java事件处理一个小游戏的开发第5天 Java GUI开发II实现自己的计算器第6天 Java GUI开发III开始即时聊天项目. 一个java窗体的大致流程:窗体(Frame)容器(Container)(设置容器布局)面板(Panel)(设置面板布局)控件.1如何实现窗体在Java程序中,我们如果想创建并运行一个窗体,就必须让我们编写的类继承自JFrame类,而使用JFrame类之前必须导入java.awt.* 和java.swing.* 。例import java.awt.*;import javax.swing.*;class Example1 extends JFrameExample1() /窗体的构造函数 this.setSize(300,200); /设置窗体的大小,300是窗体的宽,200是窗体高this.setLocation(150,250); /设置窗体出现在屏幕的位置public static void main(String args) Example1 ex=new Example1(); /实例化窗体类 ex.show(); /调用对象的show()方法 1. 窗体中的Container:如果我们要往空白的窗体中加入其它东西,我们首先需要一个Container(容器)为基础,就像在一个中空的架子上搭了一块木板,然后我们就可以在板子上放我们想放的东西。我们可以在例的构造函数中加入:Container con = this.getContentPane();这样一来窗体就获得了容器。就像:Example1() this.setSize(300,200);this.setLocation(150,250); Container con = this.getContentPane();/窗体获得容器1. 容器中的面板:面板(Panel)是包含在窗口中盛放控件的中间级别的容器。它将被Container对象包容。我们用它来归纳各种各样的控件,就像我们平常放置小东西用的带有格子的抽屉。1. 如何加载控件: 控件类包括JTextField、JLabel、JButton等等。声明您想加入窗体的控件,并调用面板对象的add()方法把控件放入面板。例import java.awt.*;import javax.swing.*; public class example2 extends JFramepublic example2()this.setSize(300,200);this.setLocation(150,250);Container con=this.getContentPane( );JPanel p1=new JPanel();/声明并创建面板con.add(p1);/面板添加到容器中JTextField text=new JTextField(10);/声明并创建一个文本框JButton button=new JButton(ok);/声明并创建一个按钮p1.add(text);/面板添加文本框p1.add(button);/面板添加按钮public static void main(String args)example2 ex=new example2();ex.show();运行结果如下: (图)1.5 设置Container和面板的布局(Layout):我们不能任由控件在窗体上随便乱放,这样就像一个没有打扫的屋子,看起来不会让人愉快。我们需要一些工具来为我们实现井井有条的布局。我们就可以声明一些用于设置窗体布局的对象。实现布局的类有:FlowLayout(流式布局)窗体默认的布局,控件从左到右排列(如图),到了窗体盛不下一列的时候就从上到下排列。BorderLayout(边框式布局)使用此布局,控件将被放在窗体的东、南、西、北、中部的位置。 GridLayout(网格式布局)窗体格局被划分为自定义的单元格。CardLayout(卡片式布局)面板以重叠的方式放置在窗体上。当一张面板呈现在我们眼前时,窗体上其它的面板将被隐藏起来。下面我们介绍一下我们常用的两种布局BorderLayout 和 GridLayout的用法。1. 5. 下面是如何在面板中使用BorderLayout的例子:例3import java.awt.*;import javax.swing.*;class Example1 extends JFrameExample1()this.setSize(300,200);this.setLocation(150,250);Container con=this.getContentPane();JPanel p1=new JPanel();con.add(p1); /容器加载面板JTextField text=new JTextField();JButton button=new JButton(ok);p1.setLayout(new GridLayout(2,1); /布局被设置为网格布局,(2,1)表示两行一列p1.add(text);/text被加到面板(1,1)单元格中p1.add(button);/text被加到面板(2,1)单元格中 public static void main(String args) Example1 ex=new Example1(); ex.show();效果如下: 按钮文本框(图)这样我们就有了一个界面看起来比较整齐的窗体。如果我们想让按钮变得再小一些,我们可以改成在(1,1)和(2,1)单元格中各放入一个面板,在每个面板上使用流式布局添加按钮和文本框。或者我们可以直接把Container的布局设置为GridLayout (2,1),在Container的两个单元格中各加入一个面板。修改代码如下:例4import java.awt.*;import javax.swing.*;class Example1 extends JFrameExample1()this.setSize(300,200);this.setLocation(150,250);Container con=this.getContentPane();con.setLayout(new GridLayout(2,1);/设置Container布局为GridLayoutJPanel p1=new JPanel();/创建面板1JPanel p2=new JPanel(); /创建面板2con.add(p1);/面板1被放在(1,1)con.add(p2);/面板2放在(2,1)JLabel l1=new JLabel(请输入文字:); /我们再增加一个标签JTextField text=new JTextField(10); /设置文本能最大输入10个字JButton button=new JButton(ok);p1.add(l1);/面板1按默认布局放置标签和文本框p1.add(text);p2.add(button);public static void main(String args)Example1 ex=new Example1();ex.show();修改后结果:面板2面板1(图2.1)*注意*如果使用流式布局, 并且文本框加上标签的宽度超出了窗体的宽度,则标签与文本框会变成上下排列。譬如我们把文本框最大输入改为20 ,结果会变成:(图2.2)1. 5. 2 下面是如何在面板中使用GridLayout的例子:例5Example1()this.setSize(300,200);this.setLocation(150,250);Container con=this.getContentPane();JPanel p1=new JPanel();JTextField t1=new JTextField( t1);JTextField t2=new JTextField( t2);JTextField t3=new JTextField(t3);JTextField t4=new JTextField(t4);JTextField t5=new JTextField( t5);p1.setLayout(new BorderLayout();/布局被设置为边框式布局p1.add(t1,BorderLayout.NORTH);p1.add(t2,BorderLayout.SOUTH);p1.add(t3,BorderLayout.EAST);p1.add(t4,BorderLayout.WEST);p1.add(t5,BorderLayout.CENTER);con.add(p1); 效果如下: WESTNORTHEASTCENTERSOUTH(图)使用了BroderLayout 时,放在CENTER部位的控件会尽可能的得到窗体的空间。而其他位置的控件会尽可能地变小(长)。 2.有了上面知识的铺垫,我们先在可以来写一个简单的登录界面了。* *聊天程序代码:实现部分:登陆界面import java.awt.* ;import javax.swing.* ;public class wyClient extends JFrame /可以把控件声明在外面,这样控件会拥有更高的被访问权JTextField username ;/声明文本框,用来输入用户名JTextField password ; /声明文本框,用来输入密码wyClient() this.setSize(300,200);this.setLocation(150,250);Container con=this.getContentPane();con.setLayout(new GridLayout(2,1);JPanel p1=new JPanel();JPanel p2=new JPanel(); con.add(p1);con.add(p2);JLabel l1=new JLabel(用户名:);JLabel l2=new JLabel(密 码:);JTextField tusername=new JTextField(20);JTextField tpassword=new JTextField(20);JButton bok=new JButton(ok);/声明确认按钮JButton bcancel=new JButton(cancel);/声明取消按钮p1.add(l1);p1.add(tusername);p1.add(l2);p1.add(tpassword);p2.add(bok);p2.add(bcancel); public static void main(String args) wyClient w = new wyClient() ;w.show() ;Username文本框运行结果如下: 面板Password文本框面板(图) 我们再来“画”一个用来发送聊天信息的窗体。* *聊天程序代码:实现部分:登陆界面,主界面import java.awt.*;import javax.swing.*; class wyMain extends JFrame JTextField tsend;/在外部声明文本框,用来写留言JComboBox clist;/声明下拉列表框,用来罗列在线用户JTextArea ta;/声明大型文本区,用来显示聊天记录wyMain(String title)super(title); /访问父类JFrame的构造函数,为窗体实现标题this.setSize(400,300);/窗体为400宽,300高this.setLocation(150,250);Container con=this.getContentPane();con.setLayout(new BorderLayout();/设置窗体布局为BorderLayoutJPanel pp=new JPanel();JPanel p1=new JPanel();JPanel p2=new JPanel();ta=new JTextArea(); /实例化大型文本区ta.disable();/设置只读属性pp.setLayout(new GridLayout(2,1);/把pp设成2,1格式的网格布局pp.add(p1);/在(1,1)单元格放p1pp.add(p2);/在(2,1)单元格放p2con.add(p,BorderLayout.NORTH);/ Container 把pp放在窗体北边con.add(ta,BorderLayout.CENTER); /Container把文本区放在中间部位,让它能拥有足够的空间JLabel l1=new JLabel(留言:);JLabel l2=new JLabel(To:);tsend=new JTextField(30);/实例化文本框clist=new JComboBox(); /实例化下拉列表框JButton bSend=new JButton(Send); p1.add(l1);p1.add(tsend);p2.add(l2);p2.add(clist);p2.add(bSend);clist.addItem(所有人); /下拉列表框添加一项内容我们现在有了一个叫做“主界面”的java类,我们给这个类加上主函数再运行: public static void main(String args)wyMain wm=new wyMain(“聊天窗口”);wm.show(); 界面效果如下: (图4.1). 添加事件 我们的聊天程序现在已经有了界面了,但是我们必须想法子让界面上的控件能够实现它的具体功能,不然的话界面再漂亮也是毫无意义的。于是我们需要为窗体定义一些事件。什么是事件?窗体上任何东西都能成为事件源。事件就是描述事件源发生的变化的对象。我们可以通过事件传来的信息去执行我们想要的事件响应。譬如说:一个人的手臂被蚊子叮了一口,就触发了人被蚊子叮的事件,人的身体(事件源)得到了被叮的消息,就从信息中辨别被叮的部位,然后伸手去那个部位准确地把蚊子打死。我们叫打蚊子的动作为事件的响应。事件的类型:3. 3 设立事件监听器: 拿上面的例子来说,人的皮肤就是负责监听事件传来消息的监听器 。在java中,事件监听器就是一个接口。我们如果想让窗体对一种事件做出响应,我们就必须为窗体植上“皮肤” 设立监听器。4如何注册窗体的事件以及如何设立监听器:为了登录功能能够实现,我们现在在wyClient中设立按钮事件的监听器。步骤 : 实现窗体事件监听器接口单击这里(图)我们会见到下图所示的窗口: 选择好要实现接口的类(图)步骤:在图的窗口中选择 javaawtevent,如下图:(图)步骤:如果我们要实现的事件是按钮事件,属于动作类事件 , 我们就再选择ActionListener实现“按钮事件监听”。(图8) 按下“ok”,这时我们会发现程序中发生了一些变化。这表示我们的窗体类已经实现了ActionListener接口。再观察程序主函数的下面。我们会发现多了一个方法。(图9)填写事件响应代码 这个时候我们的事件监听就完成了吗?答案是:还没有。我们只是创造了“皮肤”,还必须把“皮肤”放到控件上面去。这样窗体才会通过“皮肤”来“感应”到是哪个控件上发生了变化。这时我们可以在方法void actionPerformed(ActionEvent e)中加入事件发生需要实现的代码。还记得前面介绍过的事件对象的种类吗?ActionEvent是描述按钮事件信息的对象。当按钮状态发生变化(比如 : 按下,弹起)时, 窗体就会自动调用action-Performed方法 , 通过传进来的ActionEvent 对象中携带的信息判断发生变化的部位随后执行对事件作出的响应。 我们要让图4中的“Ok”按钮按下后,程序判断输入“用户名”文本框中的口令是否正确,如果正确则显示出聊天主界面。为了窗体类之间能互相 调用,我们把窗体类打包,在需要使用的时候调用。*聊天程序代码(登录部分):实现部分:登录界面,登录事件package huayu.qq;/在wyMain文件中也写同样打包语句import java.awt.*;import javax.swing.*;import java.awt.event.ActionListener;import java.util.EventListener;import java.awt.event.ActionEvent;import huayu.qq.wyMain;/引入wyMain窗体类public class wyClient extends JFrame implements ActionListener JTextField tusername;JTextField tpassword;public wyClient(String title)super(title);this.setSize(300,200);this.setLocation(150,250);Container con=this.getContentPane();con.setLayout(new GridLayout(2,1);JPanel p1=new JPanel();JPanel p2=new JPanel();con.add(p1);con.add(p2);JLabel l1=new JLabel(用户名:);JLabel l2=new JLabel(密 码:);tusername=new JTextField(20);tpassword=new JTextField(20);JButton bOk=new JButton(Ok);JButton bCancel=new JButton(Cancel);p1.add(l1);p1.add(tusername);p1.add(l2);p1.add(tpassword);p2.add(bOk);p2.add(bCancel);bOk.addActionListener(this);bCancel.addActionListener(this);public static void main(String args)wyClient w=new wyClient(登录窗口);w.show();public void actionPerformed(ActionEvent e) System.out.println(e.getActionCommand(); /取得并且打印按钮的值String uid=tusername.getText();/取得输入的用户名String pwd=tpassword.getText();/取得输入的密码if(e.getActionCommand().equals(Ok) /判断按钮值是否为”ok” if(uid.equals(Huayu)&pwd.equals(123456) /判断输入的字符串的值 /如果输入正确,把用户名传到聊天主界面中显示 wyMain wm=new wyMain(uid); wm.show(); /显示主界面 this.hide(); /本窗体隐藏 else if(e.getActionCommand().equals(Cancel) /如果按下的是”cancel” System.exit(0);/正常退出 现在实现下一个功能:在聊天界面中,按下“发送”按钮后留言框的文字会跑到聊天记录框中去。*聊天程序代码(主界面部分):实现部分:主界面、留言事件package huayu.qq;/类打包import java.awt.*;import javax.swing.*;import java.awt.event.ActionListener;import java.util.EventListener;import java.awt.event.ActionEvent; public class wyMain extends JFrame implements ActionListener JTextField tsend;JComboBox clist;JTextArea ta;public wyMain(String title)super(title);this.setSize(400,300);this.setLocation(150,250);Container con=this.getContentPane();con.setLayout(new BorderLayout();JPanel p=new JPanel();JPanel p1=new JPanel();JPanel p2=new JPanel();ta=new JTextArea();ta.disable(); p.setLayout(new GridLayout(2,1);p.add(p1);p.add(p2);con.add(p,BorderLayout.NORTH);con.add(ta,BorderLayout.CENTER);JLabel l1=new JLabel(留言:);JLabel l2=new JLabel(To:);tsend=new JTextField(30);clist=new JComboBox();JButton bSend=new JButton(Send);p1.add(l1);p1.add(tsend);p2.add(l2);p2.add(clist);p2.add(bSend);clist.addItem(所有人);bSend.addActionListener(this);public void actionPerformed(ActionEvent e) String str=tsend.getText();/接收输入留言框的字符串String me=this.getTitle();/取得窗体标题记录的用户名/取得下拉列表中的选项String others=clist.getSelectedItem().toString();if(e.getActionCommand().equals(Send)tsend.setText();/清空留言框/设置聊天记录文本区的内容ta.setText(ta.getText()+me+对+others+说:+str+n);这样一番修改之后,我们聊天程序的界面就基本实现了。第7天 高级I/O流编程聊天记录我们在上个章节实现了程序的界面,包括像布局、事件、控件、容器等不可或缺的基本因素。这时我们会发现一个问题:不论如何在界面中发送信息,关闭程序后再打开,所有的消息都会清空掉。因为这时我们的程序根本就是重新创建的,原来的变量控件都已经不存在了。这时我们需要再写一段代码,把输入过的留言都写到一个文件中。在java中操作文件需要用到输入流和输出流。我们需要在程序中导入 java.io.* 工具包。包中放的是一组流类。1怎么理解流?我们要从文件或内存读取或者写入信息,程序就要打开一个流。那我们就可以把流理解为一个连接文件 、内存和程序的管道,数据通过这条管道流向程序或流向。我们在读取文件或内存时称它们为源,在写入时称它们为目标。 流按方向分为输出流(OutputStream)和输入流(InputStream)流按用途分为字符流和字节流。字符流用于读写字符,常用于读写文本文件。字节流用于读写字节,常用于读写二进制文件,如图像、声音文件等。InputStream和OutputStream是java.io包中定义的抽象类,它们不能被实例化,即不能生成它的对象。字节流和字符流就是继承它们并增加了相关方法的子类。下面我们简单介绍一下字节输入流(FileInputStream )和字节输出流(FileOutputStream)。1 1 字符流1.1.1 字符输入流(FileInputStream)FileInputStream类可以实例化,用于从磁盘文件读取数据。我们可以以下面几种方式实例化该类: (1)将文件名作为构造函数的参数,如:FileInputStream fs = new FileInputStream(“c:/temp.txt”);(2)将File类的对象作为构造函数的参数,如:File f = new File(“c:/temp.txt”);FileInputStream fs = new FileInputStream(f);File类是一个用来描述文件的文件名或者所在路径的java类。下面是一个使用字符流的案例:例1我们先得在目前工作目录下新建一个叫做aaa的文本文件,里面在输入“I love this game !”。“aaa.txt”是文件相对当前目录的相对路径,如果我们想操作其他盘或目录下的文件,则需要加上盘符和目录名,我们称之为绝对路径。譬如:”f:/myDir/aaa.txt”。接下来我们尝试如下代码:import java.io.*;/引入java.io包class IOexamplepublic static void main(String args)try/实例化一个File类的对象File f = new File(aaa.txt);/把对象当作参数实例化字节输入流FileInputStream fis = new FileInputStream( f );/调用read()方法读取第一个字节,方法返回第一个字节的ASC码System.out.println( fis.read( ) );catch(IOException ie)ie.printStackTrace();结果应该是在屏幕输出73,这是字母“I”和键盘对应的ASC码。如果我们把fis.read()返回的ASC码转换成char类型,则屏幕会打印出“I”。System.out.println(char)fis.read();这里我们简单介绍一下异常:有些代码不套在异常里是通不过编译的。异常我们可以理解为一套语句块,try块里放置的是那些可能会导致系统出现运行时错误的语句,而catch块里放的是如果出现了错误后程序自动执行的处理机制。最后,finally块是一个特殊的语句块,一般可以省略不写,一旦写了的话,不论出现错误与否,程序最后都会执行这个块里面的代码。这就好象是我们用try将一个班级的学生保护起来,一旦发生那个学生感冒发烧这样的问题(我们称为异常),整个系统将发现,并送到准备好的catch()中处理,这就是异常处理的机制。异常的语法为:try受保护的语句catch( 异常类对象 )处理机制语句 finally 语句catch块中的”异常类对象”参数是异常类的对象,由系统自动传进来,描述系统出现的错误。而文件操作时就可能会出现找不到指定的文件异常(File-NotFoundException)、遇到文件末端异常(EofException)等等。它们是文件操作异常根类(IOException)的子类。 言归正传,我们再把输出语句变成循环输出语句,把一整句话输出在屏幕。import java.io.*;class IOexamplepublic static void main(String args)try/保护起文件操作的代码File f = new File(aaa.txt);FileInputStream fis = new FileInputStream(f );int size=fis.available();/返回流中字符的个数for(int i=0;isize;i+)System.out.print(char)fis.read();catch(IOException ie)/设置错误处理机制System.out.println( ie.getMessage(); /输出错误消息 这段代码中需要注意的是:当我们调用了 fis的read()方法时,保存在流里的字符的个数就会减少,就好像喝珍珠奶茶时吸管里的巧克力豆,吸一口,吸管里就少一粒。所以我们说available()的返回值是会不断减少的,我们如果用它作为退出循环的判断就保证不了循环进行的次数。所以必须事先把它赋给一个整型变量。1.1.2字符输出流(FileOutputStream) 我们把例1中代码的功能加强一下,变成能够拥有写入功能的代码。首先我们得在本目录下再新建一个叫bbb的文本文件。例1.2/记得要导包import java.io.*;class IOexamplepublic static void main(String args)try File f = new File(aaa.txt);/new了一个描述bbb文件的对象File fo = new File(“bbb.txt”); FileInputStream fis = new FileInputStream(f );/new了一个输出流指向bbbFileOutputStream fos = new FileOutputStream(fo); int size=fis.available(); for(int i=0;isize;i+)/从aaa文件读出字符 char temp = (char)fis.read(); /往bbb文件里写 fos.write( temp );catch(IOException ie) /如有错输出点错误System.out.println( ie.getMessage(); 执行程序之后我们会看到bbb文件中多出了跟aaa 中同样的内容。1.2 字节流同样操作aaa 和 bbb ,只不过我们把流换成了字节流。字符流在读写上不同于字节流的是:字符流可以处理 Unicode 字符,而字节流处理的是二进制数据;字节流必须按单个字节处理,速度较慢,而字符流获得缓存后可以一次读取一行以回车符结束的字符串。例2import java.io.*;class IOexamplepublic static void main(String args)tryFile f = new File(aaa.txt);File fo = new File(bbb.txt);/new了一个字符输入流FileReader fr = new FileReader(f);/new了一个高级流,为字符流加上了缓冲器BufferedReader br = new BufferedReader(fr); /new了一个字符输出流, true表示以追加方式写入,否则新内容会覆盖就内容,我们永远也得不到全部的内容FileWriter fw = new FileWriter(fo ,true);/new了一个使格式化输入变的简单的对象,true表示加上自动刷新缓存的功能,这样就不必调用close()关掉流PrintWriter pw = new PrintWriter( fw , true);/先取得第一行String temp=br.readLine();/判断是否为取得是否为空while(temp!= null)pw.println(temp); /先输出一行在bbb文件temp=br.readLine();/再取下一行catch(IOException ie)System.out.println(ie.getMessage();运行后我们会发现,bbb文件中也同样出现了“I love this game !”字样。那我们现在可在我们的聊天程序中加入聊天记录保留的功能。我们在当前目录下新建一个叫liaotian的文本文件。想一想,我们应该做什么?分两步实现。第一步我们应该聊天程序代码(主界面部分):实现部分:主界面、留言事件、聊天记录保留我们在主界面的留言事件中添加代码:package huayu.qq;/类打包import java.awt.*;import javax.swing.*;import java.awt.event.ActionListener;import java.util.EventListener;import java.awt.event.ActionEvent;import java.io.*; /一定要导入java.io 包public class wyMain extends JFrame implements ActionListener JTextField tsend;JComboBox clist;JTextArea ta;/在外部声明File对象指向文件liaotian,这样对象f 可以获得最高的被访问权File f = new File(“liaotian.txt”);public wyMain(String title)super(title);this.setSize(400,300);this.setLocation(150,250);Container con=this.getContentPane();con.setLayou

温馨提示

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

评论

0/150

提交评论