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

合工大Java實驗報告

| 瀏覽次數:

  實 驗

  報

 告

 課程名稱:

  Java 技術

 學生姓名:

  學號:

  專業班級:

 指導教師:

 年

 月

  日

 實驗一 Java 開發環境的安裝與配置 學院 信息工程系 專業 班級

 姓名 學號

  成績

  課程 名稱 Java 技術 實驗項目

 名

  稱

 實驗一 Java 開發環境的安裝與配置 指導教師

 教師評語

 教師簽名:

  年

 月

 日 一、實驗目的 1. 掌握 JDK 的安裝步驟。

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

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

 4. 記錄編譯與執行 Java 程序當中的系統錯誤信息提示,并給出解決辦法。

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

 在 Notepad++環境下編寫一個 HelloWorld、java 程序,在 DOS 提示符下編譯并執行這個程序 6、

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

 三、使用硬件、軟件環境 硬件環境:i5-7200U+8G 內存+256G 硬盤 軟件環境:Windows 10 操作系統 開發工具:Eclipse 四、實驗過程、步驟及原始記錄( 算法、原程序、測試結果, 分析等)

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

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

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

 實驗過程: 在 Notepad++中寫出如下代碼,并保存為 HelloWorld、java: 源代碼: public class HelloWorld {

 public static void main(String[] args) {

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

 } } 在命令行中進入到該文件路徑,并輸入 javac HelloWorld、java 完成編譯,再輸 入 java HelloWorld 完成運行 運行結果:

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

 實驗過程: 用 Eclipse 編寫包 a 包 b 的程序,并用 DOS 命令行運行。

 源代碼: 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();

 } } 運行結果:

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

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

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

 2. 如何理解 PATH 與 CLASSPATH,如何設置它們。

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

 了JDK的安裝目錄后就不用再把java文件的完整路徑寫出來了,它會自動去path 中設置的路徑中去找; classpath 就是指定您在程序中所使用的類(、class)文件所在的位置 在引入一個類時:import javax、swing、JTable 這句話就是告訴編譯器要引入javax、swing 這個包下的 JTable 類,而 classpath 就就是告訴編譯器該到哪里去找到這個類 假設 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

 實驗二 類的封裝、繼承、多態

 學院 信息工程系 專業 班級

 姓名 學號

  成績

  課程 名稱 Java 技術 實驗項目

 名

  稱

 實驗二 類的封裝、繼承、多態 指導教師

 教師評語

 教師簽名:

  年

 月

 日 一、實驗目的 1. 復習、理解 OOP 的三大特征——封裝、繼承與多態。

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

 3. 掌握關鍵字 private, protected, public 的作用,掌握靜態類,內部類的概念。

 4. 掌握多態的概念。

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

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

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

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

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

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

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

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

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

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

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

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

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

 int X, Y;

  public Point2D()

 {

  //無形參的構造方法,一定要有

 }

 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()

 {

  //無形參的構造方法,一定要有

 }

 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 平面坐標\n

 輸入橫坐標X:");

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

 System、out、print("

 輸入縱坐標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("現在將 2D 平面圖,3D 化,請給出 豎坐標Z的值");

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

 {

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

 輸入豎坐標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

 輸入橫坐標X的平移量:");

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

 System、out、print("

 輸入縱坐標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

 輸入豎坐標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);

  }

  } 運行結果:

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

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

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

 {

 public static void main(String[] args) {

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

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

  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) +"個點:");

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

 P[i]、printInfo();

 if(i != 0)

 {

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

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

 }

 }

  System、out、println();

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

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

  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) +"個點:");

 P1[i]、printInfo();

 if(i != 0)

  {

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

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

 }

  }

 } }

 五、實驗結論、分析、思考題與心得體會

 心得體會

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

 ②構造方法可以通過形參的個數、類型、排列不同來重載,同時也學會了如何實現類方法的多態。

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

 思考題 什么就是類的多態性。

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

 另一種多態就是與繼承有關的多態,就是指同一個操作數被不同類型對象調用時可能產生不同的行為。

 實驗三 輸入輸出流

 學院 信息工程系 專業 班級

 姓名 學號

  成績

  課程 名稱 Java 技術 實驗項目

 名

  稱

 實驗三 輸入輸出流 指導教師

 教師評語

 教師簽名:

  年

 月

 日 一、實驗目的 1. 掌握 Java I/O 基本原理。

 2. 學會使用 Java 提供的實用類來完成特定的功能。

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

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

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

 2. 實現給出的 Java Application 程序,并分析其功能。

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

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

 完成文件的復制:先使用字節流從“copy”文件中讀取數據,接著將讀取到的數據寫入到“temp、txt”文件中去,實現 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);

  } } } 運行結果: 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);//以尾加方式創建指向文件fWrite的out流

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

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

 BufferedReader bufferRead=new BufferedReader(in); //創建指向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;

 } } 運行結果:

 記事本信息:

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

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

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

 4、掌握了、、BufferedReader、BufferedWriter 抽象類的基本使用方法,實現修改讀取的內容,添加內容存儲進入文件中。

 實驗四 基于 GUI 的網絡通信程序設計

 學院 信息工程系 專業 班級

 姓名 學號

  成績

  課程 名稱 Java 技術 實驗項目

 名

  稱

 實驗四 基于 GUI 的網絡通信程序設計 指導教師

 教師評語

 教師簽名:

  年

 月

 日 一、實驗目的 1. 掌握 Java 中 GUI 程序的編寫,包括事件監聽機制。

 2.

 掌握 Java 的網絡通信編程,ServerSocket,Socket 類的使用。

 3.

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

 4.

 掌握用面向對象的方法分析與解決復雜問題。

 二、實驗原理 使用 Java Swing 中的組件實現 GUI 程序的編寫,包括使用監聽器、ServerSocket,Socket 類實現輸入輸出數據。

 同時使用 Thread 類,Runnable 接口,實現多線程執行程序。

 (1)設計一個基于 GUI 的客戶-服務器的通信應用程序,如圖 1,圖 2 所示。

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

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

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

 通過寫一個主類,與一個實現類,主類通過創建實現類的對象來調用其構造方法來實現功能。實現類中包括各種方法與內部類通過方法的層層調用,來實現所需要的結果。

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

 服務器代碼: 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("服務器");

  serve、setVisible(true);

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

  serve、setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE); //設置默認關閉操作

  } }

 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 注冊一個監聽器

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

  }

  void init(){

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

  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); //設置滾動條

  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())); // 創建一個服務器套接字對象 s,形參為從 port 文本框中讀取的整型(端口號)

 socket = s、accept();

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

  out、println("Connected");

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

  ServerThread st = new ServerThread(); //創建一個 ServerThread 對象st,并調用其構造方法

  st、start(); //啟動一個線程,并調用 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 中獲取的輸出流

 str=cin、getText();

  if(!str、isEmpty()){

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

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

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

  }

 cin、setText("");

  } catch (Exception ex) {}

  }

 }

  class ServerThread extends Thread{

 public void run(){

  try {

 BufferedReader in = new BufferedReader(new InputStreamReader(socket、getInputStream())); //創建一個緩沖輸出流,其形參為從套接字 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); //設置此窗體就是否可由用戶調整大小

  client、setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE); // 設置關閉操作

  }

  }

 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); //注冊監聽器

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

  }

  void init(){

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

  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); //設置滾動條

  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 不可再次點擊

 try {

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

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

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

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

 ct、start(); //啟動一個線程,并調用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 獲取字節輸出流,并將其最終轉化為 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(); //清空緩存區

  }

  cin、setText("");

  } catch (Exception ex) {}

  }

 }

  class ClientThread extends Thread{

 public void run(){

  try {

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

  String str;

 while(true){

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

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

  }

 } catch (Exception ex) {}

  }

 }

 } 運行結果:

 五、實驗結論、分析、思考題與心得體會

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

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

推薦訪問: 實驗 報告 合工大

【合工大Java實驗報告】相關推薦

工作總結最新推薦

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

  • ***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體

  • 根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服

  • 2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建

  • 各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學

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

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

  • 按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”

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

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