免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2098 | 回复: 0
打印 上一主题 下一主题

Java的简单程序和开发工具 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-13 23:09 |只看该作者 |倒序浏览

  Java的程序分为两类:可独立解释执行的应用程序(Application)和需放入HTML文件中依靠浏览器显示结果的Applet。在Java的开发工具包JDK(Java Developer's Kit)环境中能方便地编译、运行和调试这两种程序。这一章将给出应用程序Application和Applet最简单的程序示例,同时对JDK及其使用进行介绍。
3.1 Java应用程序Application
  和其它语言一样,Java可用于创建独立的应用程序,称为Application。所谓独立,是相对于Applet对浏览器的依赖而言。实际上它的执行离不开JDK中的编译器Javac和解释器java。
  让我们来考察若干完整而简单的Java应用程序,通过它们来了解Java应用程序的结构和特点。
  例3.1
  1  /* WelcomeApp.java */
  2  import java.lang.System;
  3  class WelcomeApp{
  4    public static void main(String args[]){
  5      System.out.println("Welcome to Java World!");
  6    }
  7  }
  这是一个十分简单且完整的Java应用程序。运行结果,将在屏幕上显示出:
  Welcome to Java World!
  已经掌握了C和C++语言的人会发现Java的程序结构看上去与C语言的形式很相似。这正Java语言设计时追求的目标之一:让多数程序员觉得熟悉亲切,从而容易被接受。接下来我们逐行解释这一程序段。
  程序的第1行是/*和*/标记的注释,给出程序的文件名WelcomeApp.java。在Java中所有的程序源文件名后缀必须是Java。第2行通过关键字import引入了在程序外部定义的类System,它是在包java.lang中定义的,因而引入时必须指出完整的路径:
  import java.lang.System;
  这样可以告诉编译器在编译源码时,将Java.lang中有关System类的内容调入使用。其中java.lang是Java的21个包之一,这些包提供了大量可重用的类和方法,方便程序员编写实用的程序。也可以使用如下语句一次性调入lang包中的所有类和方法:
  import java.lang.*;
  几乎在所有Java程序的开头,都有一个或几个import语句。
  第3行声明了一个名为WelcomeApp的类。作为面向对象的语言,Java要求所有的变量和方法都必须封装在一定的类(class)或接口(interface)中。类和接口就是Java程序构作的基础,也是进行编译和运行的程序单位。本例中WelcomeApp类的声明缺省了继承关系的说明。在Java中缺省父类说明意味着新声明的类是对象类(Object)的一个子类。而通常完整的类声明格式应为:
  [类修饰符] class 类名 [extends 父类名] {变量及方法}
  第4至7行是类WelcomeApp的类体定义部分。该部分通常用花括号“{”和“}”起止,包括变量和方法声明。例3.1的WelcomeApp类中没有定义变量,仅定义了一个方法,被声明为
  public static void main(String args[])
public表明这个方法是可被公开访问的;void表明该方法无返回值;Static表明这是一个类方法。main是这个方法的名称,组成方法的具体语句也必须由花括号将它们与其它方法和变量分隔开。main方法是一个特殊的方法,它是每一个应用程序所必须的。是应用程序解释执行的入口,必须声明为类方法,必须带有字符串数组类型的参数,但参数名可以任意。
  如若省略main方法的声明,解释器将在执行时给出出错提示:
  void main(String argv[]) is not defined
  (未定义void main(String argv[]方法)
  这里的argv是编译系统缺省使用的参数名,实际用户可以用任意名称代替。
  程序第5行main方法的唯一语句调用了System类中的out变量的println方法,以实现最终的屏幕显示:
  System.out.println("Welcome to Java World!");
println带有一个字符串参数,用来指定输出。由于已经在程序一开始给出import调用要求,因而这里可以直接使用类System的变量和方法。
  编好一个Java应用程序后,上机运行步骤如下:
  (1)编辑。在编辑窗口中输入并存成后缀为.java的文件,其中文件名必须与定义的应用程序类名一致。如例3.1的程序应存为WelcomApp.java文件。
  (2)编译。在有效的目录下输入如下的命令行:
  javac 文件名.java
即可启动编译器。所谓有效的目录是指设定好所需的编译连接和调用类库路径的目录。当出现这方面的问题时,可在DOS窗口下使用set path和set classpath命令修改和增加路径设定,也可以增加javac的参数,这在本章第三节会加以介绍。编译通过后,将自动生成程序中新声明的类文件。如例3.1的程序成功编译的结果是生成新文件WelcomeApp.class。
  (3)解释运行。同样通过输入如下的命令行:
  java 类名
就可以启动解释器java执行程序。需要注意的是,这里的类名不是编译产生的文件全名,需要去掉后缀.class,下面两种写法是不同的:
  (正确)java WelcomeApp
  (错误) java WelcomeApp.class
后者将无法正确执行并给出出错信息:
  Can't find class WelcomeApp.class.class
因为解释器java会输入的名字整个作为类名,自动加上.class后缀搜索类库。
3.2 Applet
  在这一节中,我们将介绍Java程序的另一种类型:Applet。Applet无法通过解释器解释执行,而必须放入一个HTML文件中,再通过appletviewer或支持Java的浏览器显示执行。HTML(HyperText Markup Language)是一种用于编写网络页面的专用语言。对希望通过Internet网络来传送理想页面的人来说,Applet是极度其有用的工具。它提供了大量控制页面外观和处理交互事件的便利工具,能大大提高页的生动性和交互性。下面我们将给出一个与例3.1实现相似功能的Applet程序,并逐行加以解释。
  例3.2
  1 /* Welcome.java as Applet */
  2 import java.awt.Graphics;
  3 public class Welcome extenes java.applet.Applet{
  4  public void init(){
  5   resize(350,150);
  6  }
  7  public void paint(Graphics g){
  8   g.drawString("Welcome to Java World!",50,25);
  9  }
  10 }
  与例3.1类似,程序的第1行是以/*和*/标记的注释,给出程序的文件名Welcome.java。第2行是import语句,引用了Java的awt包(Abstract Windowing Toolkit)的Graphics类:
  import java.awt.Graphics;
awt包在Applet中常被引用以控制所定义的Applet的显示。
  程序的第3行定义了一个Applet类的子类Welcome:
   public class Welcome extends java.applet.Applet
  与例3.1展示的应用程序定义不同的是,所有的applet都是从基类java.applet.Applet派生出来的子类,因而声明时都需要明确写这一继承关系:
  class Applet 类名 extends java.applet.Applet
  例3.2的程序定义了两个方法。第4至6行是init方法。在init方法中语句
  resize(350,150);
将Applet的窗口尺寸定为350象素×150象素大小,第7至9行定义paint方法。它带有一个参数g。g是图形类(Graphics)的实例对象,它是由父类Applet有关处理图形对象的方法传递过来的。当Welcome被要求显示时,paint方法就会被激活调用。其中的语句
    g.drawString("Welcome to Java World!",50.25);
实现的功能 是在窗口上坐标为(50,25)处显示出给定字符串:
  Welcome to Java World!
  与Java的应用程序相同,一个编辑好的Applet源文件应当存储成后缀为.java的文件,然后再通过javac编译器编译,成功后生成后缀为.class的类文件。然而这样的类文件是不能像应用程序一样借助解释器(interpreter) 直接运行的,因为源文件中没有定义main方法作为解释器执行的入口。用java运行这样的类文件将得到出错信息:
  void main(String arvg[]) is not defined
  (未定义void main(String argv[]方法)
  因此我们要看到Applet的运行情况必须经过以下的步骤:
  (1)将Applet谢谢HTML文件中。与一般的HTML文件相比,这样的HTML文件新添加了和标记来指明应当在何外装入一个Applet。装入的Applet还可附带有运行时的参数,每一个参数都用一条语句来指明。通常最简单的格式是
  
    {
  2 
  3 Example:Welcome to Java world!
  4 
  5 
  6 Welcome Everybody:
  7 
  8 
  9 
  整个文件共九行,第1行和第9行分别是HTML文件的固定起止标志和。第2行至第4行为以和标记的文件头部分,其中第3行的标记给出该文件的标题,将显示在网络页面窗口最上方的标题栏上。第5行起为文件的休部分,标记。体部分的内容将显示在文件对应构造的网络页面中。在例3.3中,体部分包括字符串和以标记的一个Applet:
  
这个Applet的类文件为Welcome,显示宽度为350象素,长度为150象素。
  (2)通过appletviewer或浏览器来显示结果。appletviewer是JDK提供的Applet显示器,使用时只需输入命令行:
  appletviewer HTML 文件名
将会弹出一个Applet Viewer窗口,展示出指定的HTML文件中包含的Applet的内容。图3.1就是使用appletviewer显示Welcome.html文件的结果。
  细心的读者会发现图3.1中的Applet Viewer窗口没有显示Welcome.html在部分定义的句子“Welcome Everybody:”,也没有显示部分定义的标题。这是因为appletviewer是JDK提供的一个比较简单的工具,它的主要功能是方便Applet的测试,因而是不显示HTML文件中除了Applet之外的内容。当我们使用支持Java的浏览器如Hot Java和Netscape 3.0时,才能展示出整个HTML文件的内容。图3.2是使用Netscape 3.0显示Welcome.html文件的结果。
  这一次我们就能看到整个HTML文件的内容了,其中以灰色为底色的方框即为Welcome.class代表的Appet。使用浏览器的方法也很简单,只需要在浏览器的地址栏(如Netscape的Location,Hot Java的Document URL等)中取得HTML文件的有效路径,如图3.2中Netscape窗口所示。
  这样就完成了Java的一个编写运行的过程。最后为了方便装入Appet的HTML文件的编写,给出HTML文件中标记段的详尽格式和说明。
  
3.3 Java开发工具包
  在前两节介绍Java的应用程序和Applet的编写运行进程时,我们已经提到Java的编译器javac、解释器java以及Applet显示器appletviewer的简单使用。这三者实际上都是Java提供的开发工具包JDK(Java Developer's Kit)的组成部分。这一节我们将完整地了解JDK的组成和使用。
  提供JDK目的是为程序开发者提供编写、测试、执行程序的一套完备的工具体系。总体说来,JDK由下面的七个部分组成:
  javac编译器
  java解释器
  appletviewer applet显示器
  jdb 调试器(debugger)
  javap 分解器
  javadoc 文档生成器
  javah C语言头文件生成器
  ■编译器javac将源文件转换成可执行文件,这些可执行文件就是以.class后缀的字节码文件。
  ■解释器java执行编译成功后生成的字节码文件。在字节码下载和执行过程中,解释器负责维护它的完整性、正确性和安全性。
  ■Applet显示器appletviewer展示Web页面中包含的Applet,通常用于Applet开发过程中的测试。
  ■调试器jdb也可执行字节码,同时提供置断点中断执行和显示变量值等功能,是查找程序错误的有效工具。
  ■分解器javap将字节码分解还原成源文件。对于从Web上获取的无法得到源文件的类,分解器是十分有用的。
  ■文档生成器javadoc自动生成指定的范围内的Java软件文档,内容包括Java源文件中的类、变量、方法、接口、例外(exception)等。
  ■C语言头文件生成器javah用以从Java的字节码上生成C语言的头文件和源文件,所生成的文件用于开发我们在后面要介绍的“源生方法”(native method)。
  要使用这些JDK工具,首先需要在命令路径(path)中加入工具程序所在的工作目录,通常中JDK环境下的in子目录。例如假设目前JDK存放在C:Java目录下,则命令行
  set path=C:Javain;
  将正确设置命令路径。若未设置好路径而试图使用JDK工具,将得到错误信息:
  Bad command or file name
  (错误命令或文件名)
  下面将对这些工具逐一进行介绍说明,重点是javac、java和appletviewer。
  3.3.1 编译器
  编译器javac对后缀为.java的源文件进行翻译转换,生成后缀为.class的可执行的类文件。使用编译器的标准格式为
  javac [选项] 源文件名
编译过程中要解决的一个重要问题是如何将程序中需要使用而又在程序外定义的类装入源码,这通常是利用引入外部包来实现的。类路径名(classpath)则用来指明到何外去搜索所引用的包和类。设定需要的类路径名的命令行格式为
  set CLASSPATH=路径名(对应Windows系列)
  set CLASSPATH 路径名(对应UNIX系列)
需要指出的是,使用set classpath及类似命令设定的类路径名不但对编译器有效,对JDK中的其它工具也同样有效。例如命令行
  set CLASSPATH=.;C:java;C:javalibclasses.zip
将告知JDK中的所有工具使用当前目录(.)、C:java目录以及C:javalib目录下的classes.zip文件作为寻找Java类的基本路径。没有正确设定类路径名,编译时将得到错误信息:
  Can't find class XXX
  (无法找到指定类XXX)
  javac还可以带有某些特定的选项,主要包括:
  ■-classpath
  这是设定编译器类路径名的另一种方法,使用时在-classpath后加上选定的类路径。不同的是用-classpath选项设定的类路径是暂是的,只适用于当前被编译的文件。
  ■-d
  通常编译生成的类文件放在被编译的源文件所在目录中,使用-d选项后编译器将把类文件改放在-d后指定的目录中。
  ■-g
  Java调试工具需要在类文件中加入额外的帮助信息,通常是有关行数的信息。使用-g选项后就可以再添加有关局部变量的信息。
  ■-O
  使用-O选项将优化程序的执行速度,同时付出的代价是文件所占空间的增大,这对要求传送速度较高的程序,如Applet,是不利的。
  ■-nowarn
  使用-nowarn选项将关闭编译器给出的警告信息,这些警告信息是编译器针对程序中能编译通过但存在潜在错误的部分提出的。
  ■-verbose
  使用-verbose模式将显示编译器工作的详细信息,譬如将给出编译的源文件名,列出为了编译这个源文件载入的类文件名。
  ■-deprecation
  当使用比现有JDK版本陈旧的API编程,如编程使用的类和方法属性JDK1.0版,而编译使用的JDK为1.1版,则选择该选项会给出对应的“过时”方法警告信息。
  =================================
  资料(来自其他材料,不是本教程的内容)
  ■ javac的用法
  这里所说的javac是指java程序的编译器,是JDK包中的一个文件,文件名是javac.exe,在JDK包的bin目录下。
  Javac的命令格式如下:
  javac [options] filename.java …
  javac_g [options] filename.java …
  javac命令将源代码编译成java字节码,java字节码由java解释器java解释执行。Java的源代码文件必须以.java结尾,在源代码文件中定义的每个类在javac中是独立的编译单元,它们在编译时相互之间不会有影响。Javac将每个类编译后的字节码存放在classname.class的文件中,如果java程序中包含了多个类,则java将生成多个class文件,每个class文件中只存入一个类的字节码,其文件名与类名相同,除非在javac命令中定义了-d选项。
  可以使用CLASSPATH指定类的位置,CLASSPATH是一组由分号隔开的用来指定路径的目录组成,当传给javac的源代码文件引用类没有在这些文件中定义时,javac将从CLASSPATH定义的类路径中寻找引用类,如:
  .;usersdacclasses
  注意,系统总是将系统类的位置加到类路径的后面,除非使用了-classspath选项指定一个路径。
  Javac_g是javac为了适应像jdb这样的调试器的一个非优化版本。
  Javac命令行选项
  -classpath path
  指定javac用来寻找类的路径,它将置换隐含的和CLASSPATH环境变量中的设置,目录之间用分号隔开,路径的一般格式为:
  .;
  例如:
  .;useravhclasses;jdkclasses
  -d directory
  定义产生class层次的根目录,如下面命令;
  javac -d  MyProgram.java
  由MyProgram.java产生的.class文件将被放在目录my_dir下。
  -g
  产生调试表。调试表中包含有行号和局部变量的信息,这些信息由调试工具使用,默认情况下,当-O选项被置上时,仅产生行号信息。
  -nowarn
  关闭警告信息。如果使用此选项,编译器将不输出任何警告信息。
  -O
  通过嵌入static、final和private方法优化编译代码。将优化程序的执行速度,此时,生成的类文件可能大一些,这对要求传送速度较高的程序,如applet,是不利的。
  -verbose
  使编译器、装配器打印出源代码文件、字节代码类文件的有关信息。
  -deprecation
  当使用比现有JDK版本陈旧的API编程,如编程使用的类和方法属于JDK1.0版,而编译使用的JDK为1.1版,则选择该选项会给出对应的“过时”方法警告信息。
  Javac支持通配符 如:
  javac *.java
  javac的缺省选项值尚不清楚,如哪位知道,不妨帖出来。
   =============================
  附:javac可能的命令选项
  ■标准格式:
  javac  
  ■可能的选项包括:
  -g 生成所有调试信息
  -g:none 生成无调试信息
  -g:{lines,vars,source} 生成只有部分调试信息
  -O 优化;可能妨碍调试或者增大类文件
  -nowarn 生成无警告
  -verbose 输出关于编译器正在做的信息
  -deprecation 输出使用了不鼓励使用的API的源程序位置
  -classpath  指定用户类文件的位置
  -sourcepath  指定输入源文件的位置
  -bootclasspath  覆盖自举类文件的位置
  -extdirs  覆盖安装的扩展类的位置
  -d  指定输出类文件的位置
  -encoding  指定源文件中所用的字符集编码
  -target  生成指定虚拟机版本的类文件
  3.3.2 解释器
  解释器java执行编译产生的后缀为.class的类文件。使用解释器的命令行格式为:
  java [选项] 类名 [参数]
被解释执行的类中必须有且仅有一个有效的main方法,相当于C和C++中的main函数。而上述命令行中所带的参数将在执行时传递给相应类的main方法。java也可以带上一定的选择项,主要有以下几种:
  ■-classpath
  这个选项的作用与javac中同名选项的作用相同,可以暂时改变Java的搜索类路径。
  ■-cs或-checksource
  使用这两个选项中的任一个,将在执行指定类文件之前,检查初始源文件在最近一次编译后有无改动。如果改动过,则选重新编译源文件,然后解释执行。
  ■-verify
   -noverify
   -verifyremote(缺省选项)
  这是一组有关检验的选项。其中使用-verify,解释器奖检验所有字节码;使用-noverify,解释器将不检验任何字节码;使用-verifyremote,解释器将通过类下载器在字节码下载时检验。这一检验包括对字节码的安全性、完整性以及正确性的验证。这样做的好处是提高执行的可靠性,而缺点则是增加了执行时间。
  ■-noasyncgc
  Java的“废区收集”,胜于回收内存,是一个独立的、低优先级的后台线程,与其它程序“异步”执行,也就是说当其它线程不要求执行时,才执行“废区收集”。使用-noasyncgc可以关闭这一异步自动执行的“废区收集”,而只允许程序调用或因运行系统缺乏内存而调用。这一选项通常使用于内存紧张而在程序中直接调用“废区收集”的情况。
  ■-verbosegc
  使用该选项后,每次执行废区收集释放一个对象所占内存空间时,都将给出提示信息,用于监督废区收集的进行。
  ■-v或-verbose
  与javac的同名选项相同,将给出所有执行指定类文件时装入的类名。
  ■-debug
  预备启动jdb,详见3.3.4节。
  ■-help
  给出java使用的选项名或作用说明。
  3.3.3 Applet显示器
  Java的Applet显示器appletviewer用于运行并测试程序员开发的Applet。使用appletviewer的格式为:
  appletviewer [选项] URL
  其中URL是包含被显示Applet的HTML文件的通用源定位(Universal Resource Locator)。当HTML文件位于本地机上时,只需写出文件名。
  appletviewer可带一的唯一选项是-debug。使用这一选项可显示指定Applet,同时使用调试器jdb检验并调试Applet。
  下面我们来说明使用appletviewer产生的Applet Viewer窗口的基本功能。以第二节中使用appletviewer显示例3.3的Welcome.html文件弹出的窗口为例,用鼠标在窗口左上角的Applet上点击,弹出一个下拉菜单,如图3.3所示。
  其中主要选项完成的功能如下:
  ■Restart  重新运行装入的Applet。
  ■Reload   重新装入Applet,适用于前次装入后,类文件有改动的情况。
  ■Clone   拷贝生成与现存Applet viewer窗口相同的新窗口。
  ■Tag    显示HTML文件中用于启动的标记段内容。
  ■Info   提供有关Applet的信息。
  ■Properities 显示并允许设置appletviewer的特性,见图3.3的窗口所示。
  3.3.4 调试器
  Java调试器jdb用于监督检测Java程序的执行。jdb的调用有两种方法:一种方法是直接调用,格式为:
  jdb 类文件名
这时调试器激活解释器装入类文件,然后在任何实际执行前解释器又将控制权转回交给调试器。调试器命令行可用以给解释器传递参数。第二种方法是在某个Java程序的执行过程中启动jdb。首先用java执行某类文件,只是加上-debug选项,格式为:
  java -debug 类文件名
然后解释器将显示用于启动调试器的口令,如
  Agent password=口令!
稍后可以对正在运行的类程序使用口令启动jdb,
  jdb -password 口令!
这样该程序将被挂起,控制权转给调试器。jdb还可调试不在本机上运行的程序,所需输入命令为
  jdb -host 运行机器名 -password 口令
调试器jdb对线程的调试检测尤其有用,因而我们将在第五章有关线程的介绍中详细阐述。
  3.3.5 分解器
  Java的分解器javap将经编译生成的字节码分解,给出指定类中成员变量和方法的有关信息。使用格式为:
  javap [选项] 类名
其中类名无.class后缀,它的用途在于:当用户从网上下载了某可执行的类文件而又无法取得源码时,对类文件加以分解,能迅速了解该类的组成结构,以便更好的理解和使用。
  javap可带的选项不多,其中较重要的有:
  ■-c
给出指定类实际编译生成的字节码。
  ■-h
生成可放入C语言文件的代码。
  ■-verbose
显示栈的大小、局部变量个数和方法参数信息。
  3.3.6 文档生成器
  Java的文档生成器javadoc接受源文件(后缀为.java)输入,然后自动生成一个HTML文件,描述源文件的软件结构,给出有关的类、变量和方法的信息。Sun公司使用它生成了Java的应用程序编程接口API(Application Programming Interface)文档。javadoc的使用格式有下面三种:
  javadoc [选项] 包名
  javadoc [选项] 类名
  javadoc [选项] 源文件名
  javadoc命令可带选项包括-classpath和-d,其含义和作用都与前面在编译器和解释器中提到的相同。除此之外较重要的选项还有:
  ■-noindex
省略包(package)的索引。
  ■-notree
省略类和接口的层次树显示。
  ■-sourcepath路径名
指出分析的源文件的搜索路径,与类文件搜索路径classpath不同,且互不影响。
  有关javadoc的具体使用和示例,请查阅本书第十章Applet的有关章节。
  3.3.7 C语言头文件生成器
  Java的C语言头文件生成器javah产生C语言的类文件和源文件,这些文件用来在Java的类中融入C语言的源生方法。使用javah的格式为:
  javah [选项] 类名
注意,javah与解释器java一样,接受类名(无.class后缀)而非类文件名(有.class后缀)。javah可一次输入不止一个类名。它所带的选项主要有:
  ■-o
  该选项指示javah把生成的所有结果文件放在同一个输出指定的输出文件中。
  ■-td
  该选项指示javah将生成过程中产生的临时文件放入指定的临时目录中。不使用该选项时,这些临时文件缺省地放在名为tmp的目录中。
  ■-stubs
  使用该选项,javah将生成C语言的存根文件(stubfiles)。
  有关源生方法和相关javah的使用,将在第十三章给出详细的介绍。
本章小结
  这一章我们介绍了Java的两类程序Application和Applet的基本构架,并分别给出了最简单的程序实例。Application是指无需放入HTML文件中,无需依赖浏览器,只需Java解释器就可独立执行的Java应用程序。Applet是指无需通过解释器执行,而要放入一个HTML文件中依靠浏览器显示结果的程序。在最后一节中,又简略说明了JDK的组成和使用。通过这一章的学习,读者应当对Java程序有了最基本的概念。以下各章将在此基础上逐渐深入的讲述Java的面向对象特点、多线程机制、异常处理等方面的内容。
  从这一章开始,读者可以在计算机上运行书中的示例程序,还可以试着从模仿开始,自己编制相关的Java程序,相信通过实践能够进一步巩固和提高书本中学到的内容。
  最后要提醒读者注意的是,由于Java语言本身还处在不断发展之中,JDK所提供工具的种类和功能也将随之不断扩充和修改完善。读者在具体使用时,应参阅更为详尽的有关文档。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/18/showart_15411.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP