狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

合工大Java實(shí)驗(yàn)報(bào)告

| 瀏覽次數(shù):

  實(shí) 驗(yàn)

  報(bào)

 告

 課程名稱:

  Java 技術(shù)

 學(xué)生姓名:

  學(xué)號:

  專業(yè)班級:

 指導(dǎo)教師:

 年

 月

  日

 實(shí)驗(yàn)一 Java 開發(fā)環(huán)境的安裝與配置 學(xué)院 信息工程系 專業(yè) 班級

 姓名 學(xué)號

  成績

  課程 名稱 Java 技術(shù) 實(shí)驗(yàn)項(xiàng)目

 名

  稱

 實(shí)驗(yàn)一 Java 開發(fā)環(huán)境的安裝與配置 指導(dǎo)教師

 教師評語

 教師簽名:

  年

 月

 日 一、實(shí)驗(yàn)?zāi)康?1. 掌握 JDK 的安裝步驟。

 2. 理解環(huán)境變量 PATH, CLASSPATH 的作用,以及它們的設(shè)置方法(Win XP、WIN7、WIN8、WIN10、Linux 下的不同設(shè)置方法)。

 3. 熟悉 TextPad(JCreator 或 Eclipse)編輯環(huán)境,編寫簡單的 Application 程序,并編譯與解釋執(zhí)行。

 4. 記錄編譯與執(zhí)行 Java 程序當(dāng)中的系統(tǒng)錯誤信息提示,并給出解決辦法。

 二、實(shí)驗(yàn)原理 1、源程序編譯:使用 Eclipse 或者 Notepad++ 2、程序編譯:使用 JDK 中的 javac 工具 3、程序運(yùn)行:使用 java 工具或者使用 Eclipse 直接運(yùn)行 4、掌握安裝 JDK 以及環(huán)境變量的設(shè)置 5、

 在 Notepad++環(huán)境下編寫一個 HelloWorld、java 程序,在 DOS 提示符下編譯并執(zhí)行這個程序 6、

 編寫一個類 A,它位于包 a 中,保存到 A、java 中,再編寫一個類 B,它位于包 b中,保存到 B、java 中。在類 B 中實(shí)例化類 A 的一個對象。分別編譯類 A 與類 B。

 三、使用硬件、軟件環(huán)境 硬件環(huán)境:i5-7200U+8G 內(nèi)存+256G 硬盤 軟件環(huán)境:Windows 10 操作系統(tǒng) 開發(fā)工具:Eclipse 四、實(shí)驗(yàn)過程、步驟及原始記錄( 算法、原程序、測試結(jié)果, 分析等)

 1.從 下載最新版本的 JDK,并安裝。(或者用已有文件安裝) 安裝過程: 安裝Jdk集成環(huán)境,安裝成功后,配置path,classpath路徑,讓用戶在任何目錄下均可用到 Java 的系統(tǒng)資源 ① 先配置%JAVA_HOME%環(huán)境變量,路徑為 jdk 的目錄; ②

 配置 path 環(huán)境變量,路徑為%JAVA_HOME%\bin; ③ 再 配 置 classpath 環(huán) 境 變 量 路 徑為;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools、jar 2.設(shè)置環(huán)境變量 PATH, CLASSPATH, 使得 Java 程序能正確編譯與執(zhí)行。

 3.在 Textpad(JCreator 或 Eclipse)環(huán)境下編寫一個 HelloWorld、java 程序,在DOS 提示符下編譯并執(zhí)行這個程序。

 實(shí)驗(yàn)過程: 在 Notepad++中寫出如下代碼,并保存為 HelloWorld、java: 源代碼: public class HelloWorld {

 public static void main(String[] args) {

  System、out、println("Hello World!");

 } } 在命令行中進(jìn)入到該文件路徑,并輸入 javac HelloWorld、java 完成編譯,再輸 入 java HelloWorld 完成運(yùn)行 運(yùn)行結(jié)果:

  4.編寫一個類 A,它位于包 a 中,保存到 A、java 中,再編寫一個類 B,它位于包b 中,保存到 B、java 中。在類 B 中實(shí)例化類 A 的一個對象。分別編譯類 A與類 B。

 實(shí)驗(yàn)過程: 用 Eclipse 編寫包 a 包 b 的程序,并用 DOS 命令行運(yùn)行。

 源代碼: A: package a; public class A {

 public void OUT() {

  System、out、println("this is a!");

 } } B: package b; import a、*; public class B {

 public static void main(String[] args) {

  A a = new A();

  a、OUT();

 } } 運(yùn)行結(jié)果:

  五、實(shí)驗(yàn)結(jié)論、分析、思考題與心得體會 心得體會 通過本次實(shí)驗(yàn),我對于 Java 的一些基本知識有所了解,下面我將進(jìn)行總結(jié): 1、我學(xué)習(xí)了如何安裝 JDK,以及配置 JAVA 環(huán)境 2、我學(xué)習(xí)了使用 Notepad++記事本環(huán)境下編寫 Java 程序,并使用命令行來編譯執(zhí)行程序 3、我學(xué)會了在 Eclipse 環(huán)境下編寫與運(yùn)行 Java 程序。

 4、我對于 Java 的一些基本語法與使用有所了解,包括: ①文件名必須與public類的類名相同,一個Java應(yīng)用程序最多只允許有一個public 類,并且有且只允許有一個主類, ②Java 對于大小寫敏感,同時(shí)支持中文標(biāo)識符 ③開發(fā)一個 Java 程序需要經(jīng)過三個步驟:編寫源程序、編譯源文件生成字節(jié)碼、加載運(yùn)行字節(jié)碼 ④ 在用 DOS 命令運(yùn)行包中的 Java 文件時(shí),要先編譯 A、Java,再編譯 B、Java,同時(shí)注意運(yùn)行有包名的主類時(shí),要使用包名、主類名,即 java b、B 思考題 1. 什么就是 JVM,它的作用就是什么? JVM 就是 Java 虛擬機(jī)。它就是一個虛構(gòu)出來的計(jì)算機(jī)。可在實(shí)際的計(jì)算機(jī)上模擬各種計(jì)算機(jī)功能。

 作用:將、class 字節(jié)碼文件編譯成機(jī)器語言,以便機(jī)器識別。

 2. 如何理解 PATH 與 CLASSPATH,如何設(shè)置它們。

 path 就是系統(tǒng)用來指定可執(zhí)行文件的完整路徑 java 的各種操作命令就是在其安裝路徑中的 bin 目錄下,所以在 path 中設(shè)置

 了JDK的安裝目錄后就不用再把java文件的完整路徑寫出來了,它會自動去path 中設(shè)置的路徑中去找; classpath 就是指定您在程序中所使用的類(、class)文件所在的位置 在引入一個類時(shí):import javax、swing、JTable 這句話就是告訴編譯器要引入javax、swing 這個包下的 JTable 類,而 classpath 就就是告訴編譯器該到哪里去找到這個類 假設(shè) JDK 安裝路徑: E:\Program Files\Java\jdk 變量名:PATH 變量值:E:\Program Files\Java\jdk\bin

 變量名:CLASSPATH 變量值:E:\Program Files\Java\jdk1\lib\tools、jar; E:\Program Files\Java\jdk1\jre\lib\dt、jar

 實(shí)驗(yàn)二 類的封裝、繼承、多態(tài)

 學(xué)院 信息工程系 專業(yè) 班級

 姓名 學(xué)號

  成績

  課程 名稱 Java 技術(shù) 實(shí)驗(yàn)項(xiàng)目

 名

  稱

 實(shí)驗(yàn)二 類的封裝、繼承、多態(tài) 指導(dǎo)教師

 教師評語

 教師簽名:

  年

 月

 日 一、實(shí)驗(yàn)?zāi)康?1. 復(fù)習(xí)、理解 OOP 的三大特征——封裝、繼承與多態(tài)。

 2. 學(xué)會使用 Java 編寫簡單的類。理解類的屬性與方法。

 3. 掌握關(guān)鍵字 private, protected, public 的作用,掌握靜態(tài)類,內(nèi)部類的概念。

 4. 掌握多態(tài)的概念。

 二、實(shí)驗(yàn)原理 1、分別編寫兩個類 Point2D,Point3D 來表示二維空間與三維空間的點(diǎn),使之滿足下列要求: (1) Point2D有兩個整型成員變量x, y (分別為二維空間的X,Y方向坐標(biāo)),Point2D的構(gòu)造方法要實(shí)現(xiàn)對其成員變量 x, y 的初始化。

 (2) Point2D 有一個 void 型成員方法 offset(int a, int b),它可以實(shí)現(xiàn) Point2D 的平移。

 (3) Point3D 就是 Point2D 的直接子類,它有有三個整型成員變量 x,y,z (分別為三維空間的 X,Y,Z 方向坐標(biāo)),Point3D 有兩個構(gòu)造方法:Point3D(int x,int y,int z)與Point3D(Point2D p,int z),兩者均可實(shí)現(xiàn)對 Point3D 的成員變量 x, y,z 的初始化。

 (4) Point3D 有一個 void 型成員方法 offset(int a, int b,int c),該方法可以實(shí)現(xiàn)Point3D 的平移。

 (5) 在 Point3D 中的主函數(shù) main()中實(shí)例化兩個 Point2D 的對象 p2d1,p2d2,打印出它們之間的距離,再實(shí)例化兩個 Point3D 的對象 p3d1,p3d2,打印出她們之間的距離。

 2、創(chuàng)建一個數(shù)組,隨機(jī)生成 Point2D 或者 Point3D 的對象放于其中。最后依次調(diào)用數(shù)組中每個對象的“打印方法” ,顯示數(shù)組中存儲的對象就是什么。

 提示:java、lang、Math、random()方法

 或者 java、util、Random 類 三、使用硬件 、軟件環(huán)境 硬件環(huán)境:i5-7200U+8G 內(nèi)存+256G 硬盤 軟件環(huán)境:Windows 10 操作系統(tǒng) 開發(fā)工具:Eclipse 四、實(shí)驗(yàn)過程、步驟及原始記錄( 算法、原程序、測試結(jié)果, 分析等) 1、分別編寫兩個類 Point2D,Point3D 來表示二維空間與三維空間的點(diǎn): (1) Point2D 有兩個整型成員變量 x, y (分別為二維空間的 X,Y 方向坐標(biāo)),Point2D 的構(gòu)造方法要實(shí)現(xiàn)對其成員變量 x, y 的初始化。

 (2) Point2D有一個void 型成員方法 offset(int a, int b),它可以實(shí)現(xiàn) Point2D的平移。

 (3) Point3D就是Point2D的直接子類,它有有三個整型成員變量x,y,z (分別為三維空間的 X,Y,Z 方向坐標(biāo)),Point3D 有兩個構(gòu)造方法:Point3D(int x,int y,int z)與 Point3D(Point2D p,int z),兩者均可實(shí)現(xiàn)對 Point3D 的成員變量 x, y,z 的初始化。

 (4) Point3D 有一個 void 型成員方法 offset(int a, int b,int c),該方法可以實(shí)現(xiàn)Point3D 的平移。

 (5) 在 Point3D 中的主函數(shù) main()中實(shí)例化兩個 Point2D 的對象 p2d1,p2d2,打印出它們之間的距離,再實(shí)例化兩個 Point3D 的對象 p3d1,p3d2,打印出她們之間的距離。

 利用類的繼承寫一個 point2D 類,其子類就是 point3D 。子類 Point3D 的構(gòu)造函數(shù)調(diào)用了父類的構(gòu)造函數(shù); 計(jì)算平面兩點(diǎn)的距離函數(shù)與計(jì)算空間兩點(diǎn)的距離函數(shù)寫在父類 Point2D 中,并且她們就是靜態(tài)方法, 在子類繼承后, 在其主方法 (主方法就是靜態(tài)的) 中可以直接調(diào)用 (或者通過類名調(diào)用) ;另外平移函數(shù)可以對點(diǎn)進(jìn)行平移 源代碼: import java、util、*; import java、lang、Math; class Point2D {

 int X, Y;

  public Point2D()

 {

  //無形參的構(gòu)造方法,一定要有

 }

 public Point2D(int x,int y)

 {

  this、X=x;

  this、Y=y;

 }

 public void offset(int a, int b)//2D平移方法

 {

  this、X+=a;

  this、Y+=b;

 }

  public void printInfo()

 {

  System、out、println("X= "+this、X+"\nY= "+this、Y);

 }

 public void distance(Point2D p)

  {

  double DT=1;

  DT*=(this、X-p、X)*(this、X-p、X)+(this、Y-p、Y)*(this、Y-p、Y);

  System、out、println("2D 距離:"+Math、sqrt(DT));

  } } class Point3D extends Point2D {

 int Z;

 public Point3D()

 {

  //無形參的構(gòu)造方法,一定要有

 }

 public Point3D(int x,int y,int z)

 {

  this、X=x;

  this、Y=y;

  this、Z=z;

 }

  Point3D(Point2D p,int z)

 {

  this、X=p、X;

  this、Y=p、Y;

  this、Z=z;

  }

 public void offset(int a, int b,int c)//3D平移方法

 {

  this、X+=a;

  this、Y+=b;

  this、Z+=c;

 }

  public void printInfo()

 {

  System、out、println("X= "+this、X+"\nY= "+this、Y+"\nZ= "+this、Z);

 }

  public void distance(Point3D p)

  {

 double DT=1;

  DT*=(this、X-p、X)*(this、X-p、X)+(this、Y-p、Y)*(this、Y-p、Y)+(this、Z-p、Z)*(this、Z-p、Z);

  System、out、println("3D 距離:"+Math、sqrt(DT));

  } } public class Alex

 {

 public static void main(String args[])

  {

  System、out、print("*****錄入信息*****\n");

  Scanner cin = new Scanner(System、in);

  int x[]=new int[2];

  int y[]=new int[2];

  int z[]=new int[2];

  for(int i=1;i<3;i++)

  {

 System、out、print("錄入第 "+ i +" 個 2D 平面坐標(biāo)\n

 輸入橫坐標(biāo)X:");

 x[i-1]=cin、nextInt();

 System、out、print("

 輸入縱坐標(biāo)Y:");

 y[i-1]=cin、nextInt();

  }

  Point2D _2Dp1=new Point2D(x[0],y[0]);

  Point2D _2Dp2=new Point2D(x[1],y[1]);

  _2Dp1、printInfo();

  _2Dp2、printInfo();

  System、out、println("現(xiàn)在將 2D 平面圖,3D 化,請給出 豎坐標(biāo)Z的值");

  for(int i=1;i<3;i++)

 {

 System、out、print("錄入第 "+ i +" 個 3D 平面坐標(biāo)\n

 輸入豎坐標(biāo)Z:");

 z[i-1]=cin、nextInt();

  }

  Point3D _3Dp1=new Point3D(_2Dp1,z[0]);

  Point3D _3Dp2=new Point3D(_2Dp2,z[1]);

 _3Dp1、printInfo();

  _3Dp2、printInfo();

  System、out、println("平移 2D 圖形:");

  for(int i=1;i<3;i++)

  {

 System、out、print("錄入第 "+ i +" 個 2D 圖形的平移量\n

 輸入橫坐標(biāo)X的平移量:");

 x[i-1]=cin、nextInt();

 System、out、print("

 輸入縱坐標(biāo)Y的平移量:");

 y[i-1]=cin、nextInt();

  }

  _2Dp1、offset(x[0], y[0]);

  _2Dp2、offset(x[1], y[1]);

  _2Dp1、printInfo();

  _2Dp2、printInfo();

 for(int i=1;i<3;i++)

  {

 System、out、print("錄入第 "+ i +" 個 3D 圖形的平移量\n

 輸入豎坐標(biāo)Z的平移量:");

 z[i-1]=cin、nextInt();

  }

  _3Dp1、offset(x[0],y[0],z[0]);

  _3Dp2、offset(x[1],y[1],z[1]);

  _3Dp1、printInfo();

  _3Dp2、printInfo();

 _2Dp1、distance(_2Dp2);

  _3Dp1、distance(_3Dp2);

  }

  } 運(yùn)行結(jié)果:

 2、創(chuàng)建一個數(shù)組,隨機(jī)生成 Point2D 或者 Point3D 的對象放于其中。最后依次調(diào)用數(shù)組中每個對象的“打印方法” ,顯示數(shù)組中存儲的對象就是什么。

 思想:使用 Math、random()生成數(shù)組個數(shù),點(diǎn)的個數(shù) 1-5 個,接著依次給 Point2D 數(shù)組 P 隨機(jī)輸入一個 1-50 的整數(shù),接著每次調(diào)用,調(diào)用 Point2D 中方法 printInfo(),輸出點(diǎn),除了第一次每次調(diào)用 P[i]、distance(P[i - 1]),輸出當(dāng)前點(diǎn)與上一個點(diǎn)的距離。

 Point3D 數(shù)組同上操作 源代碼:除了主類外,其它同 1 中的代碼,下面給出主類 public class Point

 {

 public static void main(String[] args) {

  Point2D []P=new Point2D[(int)(Math、random()*5) + 1];//隨機(jī)生成數(shù)組個數(shù)

  System、out、println("輸出2D數(shù)組,并輸出與上一點(diǎn)的距離:");

  for(int i=0;i<P、length;i++)

  {

 int x=1+(int)(Math、random()*50);

 int y=1+(int)(Math、random()*50);

 System、out、println("第" + (i+1) +"個點(diǎn):");

 P[i]=new Point2D(x,y);

 P[i]、printInfo();

 if(i != 0)

 {

  System、out、println("與上一點(diǎn)的距離為:");

  P[i]、distance(P[i - 1]);

 }

 }

  System、out、println();

  System、out、println("輸出3D數(shù)組,并輸出與上一點(diǎn)的距離:");

  Point3D []P1=new Point3D[(int)(Math、random()*5) + 1];//隨機(jī)生成數(shù)組個數(shù)

  for(int i=0;i<P1、length;i++)

  {

 int x=1+(int)(Math、random()*50);

 int y=1+(int)(Math、random()*50);

 int z=1+(int)(Math、random()*50);

 P1[i]=new Point3D(x,y,z);

 System、out、println("第" + (i+1) +"個點(diǎn):");

 P1[i]、printInfo();

 if(i != 0)

  {

  System、out、println("與上一點(diǎn)的距離為:");

  P1[i]、distance(P1[i - 1]);

 }

  }

 } }

 五、實(shí)驗(yàn)結(jié)論、分析、思考題與心得體會

 心得體會

 通過本次實(shí)驗(yàn),我對于 Java 如何實(shí)現(xiàn)類的繼承、封裝、多態(tài)有了初步的了解,并且學(xué)會了如何使用 Java 語言編寫簡單的類,理解了類的屬性與方法,同時(shí)掌握關(guān)鍵字 private, protected, public 的作用,以及靜態(tài)類,內(nèi)部類、多態(tài)的概念 在實(shí)驗(yàn)過程中,也有了一些心得體會: ①子類繼承父類的非私有成員,但不能繼承構(gòu)造方法,必須用 super()來調(diào)用父類的構(gòu)造方法。

 ②構(gòu)造方法可以通過形參的個數(shù)、類型、排列不同來重載,同時(shí)也學(xué)會了如何實(shí)現(xiàn)類方法的多態(tài)。

 ③Static 靜態(tài)方法只能直接調(diào)用靜態(tài)成員,不能直接調(diào)用非靜態(tài)成員, ④基本掌握了 Math 類中靜態(tài)方法,Math、pow() 與 Math、sqrt()的使用,同時(shí)學(xué)會了如何使用 Math、 random()生成隨機(jī)數(shù),與如何建立對象的數(shù)組。

 思考題 什么就是類的多態(tài)性。

 一就是操作名稱的多態(tài),即多個操作具有相同的名字,但這些操作所接收的信息類型必須不同。所謂操作名稱的多態(tài),就是指可以向操作傳遞不同的信息,以便讓對象根據(jù)相應(yīng)的信息來產(chǎn)生一定的行為。

 另一種多態(tài)就是與繼承有關(guān)的多態(tài),就是指同一個操作數(shù)被不同類型對象調(diào)用時(shí)可能產(chǎn)生不同的行為。

 實(shí)驗(yàn)三 輸入輸出流

 學(xué)院 信息工程系 專業(yè) 班級

 姓名 學(xué)號

  成績

  課程 名稱 Java 技術(shù) 實(shí)驗(yàn)項(xiàng)目

 名

  稱

 實(shí)驗(yàn)三 輸入輸出流 指導(dǎo)教師

 教師評語

 教師簽名:

  年

 月

 日 一、實(shí)驗(yàn)?zāi)康?1. 掌握 Java I/O 基本原理。

 2. 學(xué)會使用 Java 提供的實(shí)用類來完成特定的功能。

 3. 掌握、抽象類的基本使用方法。

 4. 掌握、、BufferedReader、BufferedWriter 抽象類的基本使用方法。

 二、 實(shí)驗(yàn)原理 1. 使用、、、、BufferedReader、BufferedWriter 抽象類實(shí)現(xiàn)從文件中讀取內(nèi)容,并添加所想要輸入的內(nèi)容,接著一行一行輸入到另一個文件中。

 2. 實(shí)現(xiàn)給出的 Java Application 程序,并分析其功能。

 3. 現(xiàn) 有如下格式的成績單(文本格式)score、txt: 姓名:張三,數(shù)學(xué) 72 分,物理 67 分,英語 70 分、 姓名:李四,數(shù)學(xué) 92 分,物理 98 分,英語 88 分、 姓名:周五,數(shù)學(xué) 68 分,物理 80 分,英語 77 分、 要求按給定的程序模板編寫一個 Java 程 序,能 按行讀入上述格式的成績單,并在該行的后面尾加上該同學(xué)的總成績,然后再將該行寫入到一個名字為socreAnalysis、txt 的文件中。

 三、使用硬件、軟件環(huán)境 硬件環(huán)境:i5-7200U+8G 內(nèi)存+256G 硬盤 軟件環(huán)境:Windows 10 操作系統(tǒng) 開發(fā)工具:Eclipse 四、實(shí)驗(yàn)過程、步驟及原始記錄( 算法、原程序、測試結(jié)果, 分析等) 1.該程序的功能就是通過處理字節(jié)流的抽象類:InputStream 與 OutputStream

 完成文件的復(fù)制:先使用字節(jié)流從“copy”文件中讀取數(shù)據(jù),接著將讀取到的數(shù)據(jù)寫入到“temp、txt”文件中去,實(shí)現(xiàn) copy 功能。

 源代碼: import java、io、*; public class CopyFile {

  public static void main(String[] args) {

  try {

  fis = new ("src/Copy");

 fos = new ("temp、txt");

  int read = fis、read();

  while ( read != -1 ) {

 fos、write(read);

 read = fis、read();

 }

  fis、close();

 fos、close();

  }

  catch (IOException e) {

  System、out、println(e);

  } } } 運(yùn)行結(jié)果: 2、 、

  AnalysisResult、java 源代碼: import java、io、*;

 import java、util、*; public class AnalysisResult{

 public static void main(String args[]){

 File("score、txt");

 File("scoreAnalysis、txt");

  try{

 Writer out= new (fWrite,true);//以尾加方式創(chuàng)建指向文件fWrite的out流

 BufferedWriter bufferWrite=new BufferedWriter(out); //創(chuàng)建指向out的bufferWrite流

 Reader in=new (fRead); //創(chuàng)建指向文件fRead的in流

 BufferedReader bufferRead=new BufferedReader(in); //創(chuàng)建指向in的bufferRead流

 String str=null;

 while ((str=bufferRead、readLine())!=null){

  double totalScore =Fenxi、getTotalScore(str);

  str=str+"總分:"+totalScore;

  System、out、println(str);

  bufferWrite、write(str);

  bufferWrite、newLine();

 }

 bufferRead、close();

 bufferWrite、close();

  }

  catch(IOException e){

 System、out、println(e、toString());

  }

 } } Fenxi、java 源代碼: import java、util、*; public class Fenxi{

 public static double getTotalScore(String s){

  Scanner scanner=new Scanner(s);

  scanner、useDelimiter("[^0123456789、]+");

  double totalScore=0;

  while(scanner、hasNext()){

 try{

  double score=scanner、nextDouble();

  totalScore=totalScore+score;

 }

 catch(InputMismatchException exp){

  String t=scanner、next();

  }

  }

  return totalScore;

 } } 運(yùn)行結(jié)果:

 記事本信息:

  五、實(shí)驗(yàn)結(jié)論、分析、思考題與心得體會 通過本次實(shí)驗(yàn),我對于 Java 語言關(guān)于輸入輸出流的部分有了一定的了解,下面就是我的一些收獲: 1. 掌握 Java I/O 基本原理:Java 中的 IO 包中的類可以處理不同類型的流,例如:字節(jié)流(byte[])、字符流(character)、文件流、對象流等。

 java、io 中的抽象類包括:處理字節(jié)流的抽象類:InputStream 與 OutputStream,處理過濾流的抽象類:FilterOutputStream 與 FilterInputStream,處理字符流的抽象類:Reader 與 Writer,處理壓縮流的抽象類:InflaterInputStream 與DeflaterOutputStream 2、學(xué)會如何使用 Java 給出的各種輸入輸出流來實(shí)現(xiàn)一系列的問題,包括:從文件的讀取數(shù)據(jù)、使用輸出流對數(shù)據(jù)進(jìn)行加工存儲到文件中等。

 3、掌握了、抽象類的基本使用方法,并實(shí)際操作實(shí)現(xiàn)了讀取與存儲拷貝。

 4、掌握了、、BufferedReader、BufferedWriter 抽象類的基本使用方法,實(shí)現(xiàn)修改讀取的內(nèi)容,添加內(nèi)容存儲進(jìn)入文件中。

 實(shí)驗(yàn)四 基于 GUI 的網(wǎng)絡(luò)通信程序設(shè)計(jì)

 學(xué)院 信息工程系 專業(yè) 班級

 姓名 學(xué)號

  成績

  課程 名稱 Java 技術(shù) 實(shí)驗(yàn)項(xiàng)目

 名

  稱

 實(shí)驗(yàn)四 基于 GUI 的網(wǎng)絡(luò)通信程序設(shè)計(jì) 指導(dǎo)教師

 教師評語

 教師簽名:

  年

 月

 日 一、實(shí)驗(yàn)?zāi)康?1. 掌握 Java 中 GUI 程序的編寫,包括事件監(jiān)聽機(jī)制。

 2.

 掌握 Java 的網(wǎng)絡(luò)通信編程,ServerSocket,Socket 類的使用。

 3.

 掌握 Java 中多線程的編程,Thread 類,Runnable 接口的使用。

 4.

 掌握用面向?qū)ο蟮姆椒ǚ治雠c解決復(fù)雜問題。

 二、實(shí)驗(yàn)原理 使用 Java Swing 中的組件實(shí)現(xiàn) GUI 程序的編寫,包括使用監(jiān)聽器、ServerSocket,Socket 類實(shí)現(xiàn)輸入輸出數(shù)據(jù)。

 同時(shí)使用 Thread 類,Runnable 接口,實(shí)現(xiàn)多線程執(zhí)行程序。

 (1)設(shè)計(jì)一個基于 GUI 的客戶-服務(wù)器的通信應(yīng)用程序,如圖 1,圖 2 所示。

  圖 1 Socket 通信服務(wù)器端界面 圖 2 Socket 通信客戶端界面 (2)圖 1 為 Socket 通信服務(wù)器端界面,點(diǎn)擊該界面中的【Start】按鈕,啟動服務(wù)器監(jiān)聽服務(wù)(在圖 1 界面中間的多行文本區(qū)域顯示“Server starting…”字樣)。圖 2為 Socket 通信客戶端界面,點(diǎn)擊該界面中的【Connect】按鈕與服務(wù)器建立鏈接,并在圖 2 所示界面中間的多行文本區(qū)域顯示“Connect to server…”字樣,當(dāng)服務(wù)器端監(jiān)聽到客戶端的連接后,在圖 1 界面中間的多行文本區(qū)域追加一行“Client connected…”字樣,并與客戶端建立 Socket 連接。

 (3)當(dāng)圖 1 所示的服務(wù)器端與圖 2 所示的客戶機(jī)端建立 Socket 連接后,編程實(shí)現(xiàn)這兩端的數(shù)據(jù)通信,每次將接收到對方的數(shù)據(jù)追加顯示在多行文本框中。

 三、使用硬件、軟件環(huán)境 硬件環(huán)境:i5-7200U+8G 內(nèi)存+256G 硬盤 軟件環(huán)境:Windows 10 操作系統(tǒng) 開發(fā)工具:Eclipse 四、實(shí)驗(yàn)過程、步驟及原始記錄( 算法、原程序、測試結(jié)果,分 分 析等) 1、編寫兩個文件 Client、java 與 Server、java,兩個 Java 文件的內(nèi)容相似,首先在構(gòu)造方法中寫了調(diào)用了實(shí)現(xiàn) GUI 的函數(shù),即使用 JFrame 類建立窗口,以及加入相應(yīng)的組件,使用 FlowLayout 布局,,也為按鈕注冊了監(jiān)聽器。在不同的內(nèi)部類中寫了不同監(jiān)聽器所調(diào)用的 actioPerformed()方法。

 通過寫一個主類,與一個實(shí)現(xiàn)類,主類通過創(chuàng)建實(shí)現(xiàn)類的對象來調(diào)用其構(gòu)造方法來實(shí)現(xiàn)功能。實(shí)現(xiàn)類中包括各種方法與內(nèi)部類通過方法的層層調(diào)用,來實(shí)現(xiàn)所需要的結(jié)果。

 2、在服務(wù)器中創(chuàng)建 ServerSocked 對象來接受客戶端的連接請求,并指定端口號,客戶端通過 Socket 對象與客戶端的 Socket 對象連接。連接成功后通過 IO流來通信,服務(wù)器的輸入流就是客戶端的輸出流,服務(wù)器的輸出流就是客戶端的輸入流,通過 BufferedReader 讀取相應(yīng)套接字 socket 中獲取的輸入流的內(nèi)容,并放入對應(yīng)的文本框中。

 服務(wù)器代碼: import java、awt、*;

 import java、awt、event、*;

 import java、util、*;

 import java、io、*;

 import java、net、*;

 import javax、swing、*;

 public class Server{

  public static void main(String[] args){

 MyFrame serve = new MyFrame();

 serve、setTitle("服務(wù)器");

  serve、setVisible(true);

 serve、setResizable(false); //設(shè)置此窗體就是否可由用戶調(diào)整大小

  serve、setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE); //設(shè)置默認(rèn)關(guān)閉操作

  } }

 class MyFrame extends JFrame{

  JTextField port;

  JButton start;

  JTextArea content;

  JTextField cin;

  JButton say;

  Socket socket;

  MyFrame(){

 init();

 StartListen sListen = new StartListen();

 SayListen stListen = new SayListen();

 start、addActionListener(sListen); //為按鈕 start 注冊一個監(jiān)聽器

  say、addActionListener(stListen); //為按鈕 say注冊一個監(jiān)聽器

  }

  void init(){

 setLayout(new FlowLayout()); //設(shè)置窗體為流式布局

  setSize(400,400);

 setLocation(400,100);

 add(new JLabel("Port:"));

 port = new JTextField("8888",25);

 add(port);

 start = new JButton("Start");

 add(start);

 content = new JTextArea(15,35);

 JScrollPane scroll = new JScrollPane(content); //設(shè)置滾動條

  add(scroll);

 add(new JLabel("Say:"));

 cin = new JTextField("Hello!",26);

 add(cin);

 say = new JButton("Say");

 add(say);

 }

  class StartListen implements ActionListener{

 public void actionPerformed(ActionEvent e){

  start、setEnabled(false);

  try {

 ServerSocket s = new ServerSocket(Integer、parseInt(port、getText())); // 創(chuàng)建一個服務(wù)器套接字對象 s,形參為從 port 文本框中讀取的整型(端口號)

 socket = s、accept();

 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket、getOutputStream())),true);// 創(chuàng)建一個打印輸出流對象,其形參為從套接字 socket 對象中獲取的輸出流

  out、println("Connected");

 content、append("Client connected"+"\n"); //對兩個字符串進(jìn)行拼接

  ServerThread st = new ServerThread(); //創(chuàng)建一個 ServerThread 對象st,并調(diào)用其構(gòu)造方法

  st、start(); //啟動一個線程,并調(diào)用 run()方法

  } catch (Exception ex) {}

  }

 }

  class SayListen implements ActionListener{

 String str;

 public void actionPerformed(ActionEvent e){

  try {PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket、getOutputStream())),true);// 創(chuàng)建一個打印輸出流,形參為從套接字socket 中獲取的輸出流

 str=cin、getText();

  if(!str、isEmpty()){

 out、println(new Date()+"\n"+str); //打印輸出日期與發(fā)送的消息( str)

  content、append(new Date()+" \n me:"+str+"\n");

 out、flush(); //清空緩存區(qū)

  }

 cin、setText("");

  } catch (Exception ex) {}

  }

 }

  class ServerThread extends Thread{

 public void run(){

  try {

 BufferedReader in = new BufferedReader(new InputStreamReader(socket、getInputStream())); //創(chuàng)建一個緩沖輸出流,其形參為從套接字 socket 中獲取的輸入流

  String str;

 while(true){

  str = in、readLine(); //按行讀取

 content、append( str+"\n");

  }

 } catch (Exception ex) {}

  }

 }

 } 客戶端代碼: import java、awt、*;

 import java、awt、event、*;

 import java、util、*;

 import java、io、*;

 import java、net、*;

 import javax、swing、*;

 import java、util、Calendar;

 public class Client{

  public static void main(String[] args) {

 MyFrame client=new MyFrame();

 client、setTitle("客戶端");

  client、setVisible(true);

 client、setResizable(false); //設(shè)置此窗體就是否可由用戶調(diào)整大小

  client、setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE); // 設(shè)置關(guān)閉操作

  }

  }

 class MyFrame extends JFrame {

  JTextField ip;

  JTextField port;

  JTextField cin;

  JTextArea content;

  JButton connect;

  JButton say;

  Socket socket;

  MyFrame(){

 init();

 ConnectListen cListener=new ConnectListen();

 SayListen sListener = new SayListen();

 connect、addActionListener(cListener); //注冊監(jiān)聽器

  say、addActionListener(sListener); //注冊監(jiān)聽器

  }

  void init(){

 setLayout(new FlowLayout()); //設(shè)置窗體為流式布局

  setSize(440,500);

 setLocation(800,100);

 add(new JLabel("Server:ip"));

 ip=new JTextField("127、0、0、1",8);

 add(ip);

 add(new JLabel("Server:port"));

 port=new JTextField("8888",8);

 add(port);

 connect=new JButton("connect");

 add(connect);

 content=new JTextArea(16,35);

 JScrollPane scroll=new JScrollPane(content); //設(shè)置滾動條

  add(scroll);

 add(new Label("Say:"));

 cin=new JTextField("您好!",25);

 add(cin);

 say=new JButton("say");

 add(say);

 }

  class ConnectListen implements ActionListener{

 int portNum;

 public void actionPerformed(ActionEvent e){

  connect、setEnabled(false); //按下 connect 按鈕后, connect 不可再次點(diǎn)擊

 try {

 content、setText("Connect to server、、、、\n"); //在文本區(qū)中顯示 "Connect to server、、、、\n"

 portNum =Integer、parseInt(port、getText()); //讀取 port 文本框中的字符串,并將字符串轉(zhuǎn)化為整型賦給 portNum

 socket = new Socket(ip、getText(),portNum); //定義對象 socket,并指定主機(jī)號(host)與端口號 portNum

 ClientThread ct = new ClientThread(); //定義一個 ClientThread 類的對象 ct

 ct、start(); //啟動一個線程,并調(diào)用ClientThread 類中的 run()方法

 } catch (Exception ex) {}

  }

 }

  class SayListen implements ActionListener{

 String str;

 public void actionPerformed(ActionEvent e){

  try {

  PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket、getOutputStream())),true); //從 socket 獲取字節(jié)輸出流,并將其最終轉(zhuǎn)化為 PrintWriter

  str=cin、getText(); //從文本框中獲取字符串賦給 str

  if(!str、isEmpty()){

 out、println(new Date()+ "\n"+ str); //打印日期與 str

 content、append(new Date()+"\n me:"+str+"\n");

 out、flush(); //清空緩存區(qū)

  }

  cin、setText("");

  } catch (Exception ex) {}

  }

 }

  class ClientThread extends Thread{

 public void run(){

  try {

 BufferedReader in = new BufferedReader(new InputStreamReader(socket、getInputStream())); //創(chuàng)建一個緩沖輸出流,其形參為從套接字 socket 中獲取的輸入流

  String str;

 while(true){

  str = in、readLine(); //按行讀取

 content、append( str+"\n");

  }

 } catch (Exception ex) {}

  }

 }

 } 運(yùn)行結(jié)果:

 五、實(shí)驗(yàn)結(jié)論、分析、思考題與心得體會

 通過本次實(shí)驗(yàn),我對于 GUI 程序的便編寫,以及網(wǎng)絡(luò)通信與多線程編程有了一定的了解,并且也親自實(shí)現(xiàn)了一個基于 GUI 的客戶-服務(wù)器的通信應(yīng)用程序,在實(shí)驗(yàn)過程中,我也遇到了不少的問題并加以解決: 1、因?yàn)榉?wù)器的 GUI 界面有 start 與 say 按鈕,客戶端有 connect 與 say 按鈕,按鈕被點(diǎn)擊后會觸發(fā)動作事件。而不同的按鈕要執(zhí)行不同的操作,也就意味著要寫多個 actionPerformed()方法,可就是一個類里面只能寫一個 actionPerformed()方法,因此可以寫幾個實(shí)現(xiàn)了 ActionPerformed()方法,在內(nèi)部類中再寫一個actionPerformed()方法,這樣就寫了好幾個不同的 actionPerformed()方法,在注冊監(jiān)聽器的時(shí)候,按鈕需要實(shí)現(xiàn)哪種功能,就用哪個內(nèi)部類的對象來監(jiān)聽就可以了。

 2、在服務(wù)器中創(chuàng)建 ServerSocket 對象來接受客戶端的連接請求, 并指定端口號, 客戶端通過 Socket 對象來向服務(wù)器的 ip 與端口發(fā)送連接請求。服務(wù)器在接到連接請求后,服務(wù)器會創(chuàng)建一個新的 Socket 對象與客戶端的 Socket 對象連接。連接成功后通過 IO 流來通信,服務(wù)器的輸入流就是客戶端的輸出流,服務(wù)器的輸出流時(shí)客戶端的輸入流

推薦訪問: 實(shí)驗(yàn) 報(bào)告 合工大

【合工大Java實(shí)驗(yàn)報(bào)告】相關(guān)推薦

工作總結(jié)最新推薦

NEW
  • 同志們:今天這個大會,是市委全面落實(shí)黨要管黨、從嚴(yán)治黨要求的一項(xiàng)重大舉措,也是對縣市區(qū)委書記履行基層黨建工作第一責(zé)任人情況的一次集中檢閱,同時(shí)是對全市基層黨建工作的一次再部署、再落實(shí)的會議。前面,**

  • ***年,我認(rèn)真履行領(lǐng)班子、帶隊(duì)伍、抓黨員、保穩(wěn)定的基層黨建工作思路,以學(xué)習(xí)貫徹習(xí)近平新時(shí)代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細(xì)則為落腳點(diǎn),落實(shí)全面從嚴(yán)治黨主體

  • 根據(jù)會議安排,現(xiàn)將2022年履行抓基層黨建工作職責(zé)情況報(bào)告如下:一、履職工作特色和亮點(diǎn)1 突出政治建設(shè),著力在思想認(rèn)識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領(lǐng)、社區(qū)治理求突破,為民服

  • 2022年以來,在**黨委的正確領(lǐng)導(dǎo)下,堅(jiān)持以習(xí)近平新時(shí)代中國特色社會主義思想為指導(dǎo),深入學(xué)習(xí)宣傳貫徹黨的二十大精神,以黨建工作為統(tǒng)領(lǐng),扎實(shí)開展夯實(shí)“三個基本”活動,以“四化四力”行動為抓手,聚力創(chuàng)建

  • 各位領(lǐng)導(dǎo),同志們:根據(jù)會議安排,現(xiàn)就2022年度抓基層黨建工作情況匯報(bào)如下:一、主要做法及成效(一)強(qiáng)化政治引領(lǐng)。一是不斷強(qiáng)化理論武裝。堅(jiān)持通過黨組會、中心組學(xué)習(xí)會和“三會一課”,第一時(shí)間、第一議題學(xué)

  • 2022年度抓基層黨建工作述職報(bào)告按照黨委工作部署,現(xiàn)將本人2022年度抓基層黨建工作情況報(bào)告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發(fā)展首要位置,積極開展

  • 2022年,是我在數(shù)計(jì)系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領(lǐng)導(dǎo)下,與數(shù)計(jì)系領(lǐng)導(dǎo)班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢

  • 按照考核要求,現(xiàn)將本人一年來,作為統(tǒng)戰(zhàn)部長履行職責(zé)、廉潔自律等方面情況報(bào)告如下:一、著眼增強(qiáng)政治素質(zhì),不斷深化理論學(xué)習(xí)堅(jiān)持把旗幟鮮明講政治作為履職從政的第一位要求,帶領(lǐng)統(tǒng)戰(zhàn)系統(tǒng)干部堅(jiān)決擁護(hù)“兩個確立”

  • **年,緊緊圍繞黨工委、管委會的決策部署,全體人員團(tuán)結(jié)協(xié)作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進(jìn)取,認(rèn)真履職盡責(zé),圓滿完成各項(xiàng)工作任務(wù)。一、個人思想政治狀況檸檬文苑www bgzjy

  • 按照縣委關(guān)于開展抓基層黨建述職評議會議的有關(guān)要求,經(jīng)請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究