合工大Java实验报告

上传人:无*** 文档编号:109648827 上传时间:2022-06-17 格式:DOC 页数:29 大小:1.16MB
收藏 版权申诉 举报 下载
合工大Java实验报告_第1页
第1页 / 共29页
合工大Java实验报告_第2页
第2页 / 共29页
合工大Java实验报告_第3页
第3页 / 共29页
资源描述:

《合工大Java实验报告》由会员分享,可在线阅读,更多相关《合工大Java实验报告(29页珍藏版)》请在装配图网上搜索。

1、-实 验报告课程名称:Java技术 学生*:*: 专业班级:指导教师:年 月 日. z.-实验一Java开发环境的安装与配置学院信息工程系专业班级*成绩课程名称Java技术实验工程名 称实验一 Java开发环境的安装与配置指导教师教师评语 教师签名: 年 月 日一、实验目的1. 掌握JDK的安装步骤。2. 理解环境变量PATH, CLASSPATH的作用,以及它们的设置方法(Win *P、WIN7、WIN8、WIN10、Linu*下的不同设置方法)。3. 熟悉Te*tPadJCreator或Eclipse编辑环境,编写简单的Application程序,并编译和解释执行。4. 记录编译和执行Ja

2、va程序当中的系统错误信息提示,并给出解决方法。二、实验原理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硬盘软件环境:Wi

3、ndows10操作系统开发工具:Eclipse四、实验过程、步骤及原始记录(算法、原程序、测试结果,分析等)1从.oracle./technetwork/java下载最新版本的JDK,并安装。或者用已有文件安装安装过程:安装Jdk集成环境,安装成功后,配置path,classpath路径,让用户在任何目录下均可用到Java的系统资源 先配置%JAVA_HOME%环境变量,路径为jdk的目录; 配置path环境变量,路径为%JAVA_HOME%bin; 再配置classpath环境变量路径为;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar2设置环境变量PATH, C

4、LASSPATH, 使得Java程序能正确编译和执行。3在 Te*tpadJCreator或Eclipse环境下编写一个HelloWorld.java程序,在DOS提示符下编译并执行这个程序。实验过程:在Notepad+中写出如下代码,并保存为HelloWorld.java:源代码:public class HelloWorld public static void main(String args) System.out.println(Hello World!);在命令行中进入到该文件路径,并输入javacHelloWorld.java完成编译,再输入javaHelloWorld完成运行运

5、行结果: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();运行

6、结果:五、实验结论、分析、思考题与心得体会心得体会通过本次实验,我对于Java的一些根本知识有所了解,下面我将进展总结:1.我学习了如何安装JDK,以及配置JAVA环境2.我学习了使用Notepad+记事本环境下编写Java程序,并使用命令行来编译执行程序3.我学会了在Eclipse环境下编写与运行Java程序。4.我对于Java的一些根本语法与使用有所了解,包括:文件名必须与public类的类名一样,一个Java应用程序最多只允许有一个public类,并且有且只允许有一个主类,Java对于大小写敏感,同时支持中文标识符开发一个Java程序需要经过三个步骤:编写源程序、编译源文件生成字节码、加

7、载运行字节码 在用DOS命令运行包中的Java文件时,要先编译A.Java,再编译B.Java,同时注意运行有包名的主类时,要使用包名.主类名,即javab.B思考题1. 什么是JVM,它的作用是什么?JVM是Java虚拟机。它是一个虚构出来的计算机。可在实际的计算机上模拟各种计算机功能。作用:将.class字节码文件编译成机器语言,以便机器识别。2. 如何理解PATH和CLASSPATH,如何设置它们。path是系统用来指定可执行文件的完整路径java的各种操作命令是在其安装路径中的bin目录下,所以在path中设置了JDK的安装目录后就不用再把java文件的完整路径写出来了,它会自动去pa

8、th中设置的路径中去找;classpath是指定你在程序中所使用的类.class文件所在的位置在引入一个类时:import java*.swing.JTable这句话是告诉编译器要引入java*.swing这个包下的JTable类,而classpath就是告诉编译器该到哪里去找到这个类假设JDK安装路径:E:Program FilesJavajdk变量名:PATH变量值:E:Program FilesJavajdkbin 变量名:CLASSPATH变量值:E:Program FilesJavajdk1libtools.jar;E:Program FilesJavajdk1jrelibdt.ja

9、r实验二类的封装、继承、多态学院信息工程系专业班级*成绩课程名称Java技术实验工程名 称实验二类的封装、继承、多态指导教师教师评语 教师签名: 年 月 日一、实验目的1. 复习、理解OOP的三大特征封装、继承和多态。2. 学会使用Java编写简单的类。理解类的属性和方法。3. 掌握关键字private, protected, public的作用,掌握静态类,内部类的概念。4. 掌握多态的概念。二、实验原理1.分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点,使之满足以下要求:1 Point2D有两个整型成员变量*, y (分别为二维空间的*,Y方向坐标),Point2

10、D的构造方法要实现对其成员变量*, y的初始化。2 Point2D有一个void型成员方法offset(int a, int b),它可以实现Point2D的平移。3 Point3D是Point2D的直接子类,它有有三个整型成员变量*,y,z (分别为三维空间的*,Y,Z方向坐标),Point3D有两个构造方法:Point3D(int *,int y,int z)和Point3D(Point2D p,int z),两者均可实现对Point3D的成员变量*, y,z的初始化。4 Point3D有一个void型成员方法offset(int a, int b,int c),该方法可以实现Point3

11、D的平移。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四、实验过程、步骤及原始记

12、录(算法、原程序、测试结果,分析等)1.分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点:1 Point2D有两个整型成员变量*, y (分别为二维空间的*,Y方向坐标),Point2D的构造方法要实现对其成员变量*, y的初始化。2 Point2D有一个void型成员方法offset(int a, int b),它可以实现Point2D的平移。3 Point3D是Point2D的直接子类,它有有三个整型成员变量*,y,z (分别为三维空间的*,Y,Z方向坐标),Point3D有两个构造方法:Point3D(int *,int y,int z)和Point3D(Poin

13、t2D p,int z),两者均可实现对Point3D的成员变量*, 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 的构造函数调用了父类的构造函数; 计算平面两点的距离函数和计算空间两点的距离函数写在父类 Point2

14、D 中,并且他们是静态方法, 在子类继承后, 在其主方法 主方法是静态的 中可以直接调用 或者通过类名调用 ;另外平移函数可以对点进展平移源代码:import java.util.*;import java.lang.Math;class Point2Dint*, Y;public Point2D()/无形参的构造方法,一定要有public Point2D(int*,inty)this.*=*;this.Y=y;publicvoid offset(inta, intb)/2D平移方法this.*+=a;this.Y+=b;publicvoid printInfo()System.out.pri

15、ntln(*= +this.*+nY= +this.Y);publicvoid distance(Point2D p) doubleDT=1;DT*=(this.*-p.*)*(this.*-p.*)+(this.Y-p.Y)*(this.Y-p.Y);System.out.println(2D 距离:+Math.sqrt(DT); class Point3D e*tends Point2DintZ;public Point3D()/无形参的构造方法,一定要有public Point3D(int*,inty,intz)this.*=*;this.Y=y;this.Z=z;Point3D(Poi

16、nt2D p,intz)this.*=p.*;this.Y=p.Y;this.Z=z;publicvoid offset(inta, intb,intc)/3D平移方法this.*+=a;this.Y+=b;this.Z+=c;publicvoid printInfo()System.out.println(*= +this.*+nY= +this.Y+nZ= +this.Z);publicvoid distance(Point3D p) doubleDT=1;DT*=(this.*-p.*)*(this.*-p.*)+(this.Y-p.Y)*(this.Y-p.Y)+(this.Z-p.Z

17、)*(this.Z-p.Z);System.out.println(3D 距离:+Math.sqrt(DT); publicclass Ale* publicstaticvoid main(String args) System.out.print(*录入信息*n);Scanner cin = new Scanner(System.in);int*=newint2;inty=newint2;intz=newint2;for(inti=1;i3;i+)System.out.print(录入第 + i + 个 2D 平面坐标n 输入横坐标*:);*i-1=cin.ne*tInt();System.

18、out.print( 输入纵坐标Y:);yi-1=cin.ne*tInt();Point2D _2Dp1=new Point2D(*0,y0);Point2D _2Dp2=new Point2D(*1,y1);_2Dp1.printInfo();_2Dp2.printInfo();System.out.println(现在将 2D 平面图,3D 化,请给出 竖坐标Z的值);for(inti=1;i3;i+)System.out.print(录入第 + i + 个 3D 平面坐标n 输入竖坐标Z:);zi-1=cin.ne*tInt();Point3D _3Dp1=new Point3D(_2D

19、p1,z0);Point3D _3Dp2=new Point3D(_2Dp2,z1);_3Dp1.printInfo();_3Dp2.printInfo();System.out.println(平移 2D 图形:);for(inti=1;i3;i+)System.out.print(录入第 + i + 个 2D 图形的平移量n 输入横坐标*的平移量:);*i-1=cin.ne*tInt();System.out.print( 输入纵坐标Y的平移量:);yi-1=cin.ne*tInt();_2Dp1.offset(*0, y0);_2Dp2.offset(*1, y1);_2Dp1.prin

20、tInfo();_2Dp2.printInfo();for(inti=1;i3;i+)System.out.print(录入第 + i + 个 3D 图形的平移量n 输入竖坐标Z的平移量:);zi-1=cin.ne*tInt();_3Dp1.offset(*0,y0,z0);_3Dp2.offset(*1,y1,z1);_3Dp1.printInfo();_3Dp2.printInfo();_2Dp1.distance(_2Dp2);_3Dp1.distance(_3Dp2); 运行结果:2.创立一个数组,随机生成Point2D或者Point3D的对象放于其中。最后依次调用数组中每个对象的打印

21、方法 ,显示数组中存储的对象是什么。思想:使用Math.random()生成数组个数,点的个数1-5个,接着依次给Point2D数组P随机输入一个1-50的整数,接着每次调用,调用Point2D中方法printInfo(),输出点,除了第一次每次调用Pi.distance(Pi - 1),输出当前点与上一个点的距离。Point3D数组同上操作源代码:除了主类外,其它同1中的代码,下面给出主类publicclass Point publicstaticvoid main(String args) Point2D P=new Point2D(int)(Math.random()*5) + 1;/随

22、机生成数组个数System.out.println(输出2D数组,并输出与上一点的距离:);for(inti=0;iP.length;i+)int*=1+(int)(Math.random()*50);inty=1+(int)(Math.random()*50);System.out.println(第 + (i+1) +个点:);Pi=new Point2D(*,y);Pi.printInfo();if(i != 0)System.out.println(与上一点的距离为:);Pi.distance(Pi - 1);System.out.println();System.out.printl

23、n(输出3D数组,并输出与上一点的距离:);Point3D P1=new Point3D(int)(Math.random()*5) + 1;/随机生成数组个数for(inti=0;iP1.length;i+)int*=1+(int)(Math.random()*50);inty=1+(int)(Math.random()*50);intz=1+(int)(Math.random()*50);P1i=new Point3D(*,y,z);System.out.println(第 + (i+1) +个点:);P1i.printInfo();if(i != 0)System.out.println

24、(与上一点的距离为:);P1i.distance(P1i - 1);五、实验结论、分析、思考题与心得体会心得体会通过本次实验,我对于Java如何实现类的继承、封装、多态有了初步的了解,并且学会了如何使用Java语言编写简单的类,理解了类的属性和方法,同时掌握关键字private, protected, public的作用,以及静态类,内部类、多态的概念在实验过程中,也有了一些心得体会:子类继承父类的非私有成员,但不能继承构造方法,必须用super来调用父类的构造方法。构造方法可以通过形参的个数、类型、排列不同来重载,同时也学会了如何实现类方法的多态。Static静态方法只能直接调用静态成员,不

25、能直接调用非静态成员,根本掌握了Math 类中静态方法,Math.pow() 和 Math.sqrt()的使用,同时学会了如何使用Math. random()生成随机数,和如何建立对象的数组。思考题什么是类的多态性。一是操作名称的多态,即多个操作具有一样的名字,但这些操作所接收的信息类型必须不同。所谓操作名称的多态,是指可以向操作传递不同的信息,以便让对象根据相应的信息来产生一定的行为。另一种多态是和继承有关的多态,是指同一个操作数被不同类型对象调用时可能产生不同的行为。实验三输入输出流学院信息工程系专业班级*成绩课程名称Java技术实验工程名 称实验三输入输出流指导教师教师评语 教师签名:

26、年 月 日一、实验目的1. 掌握Java I/O根本原理。2. 学会使用Java提供的实用类来完成特定的功能。3. 掌握FileInputStream、FileOutputStream抽象类的根本使用方法。4. 掌握FileReader、FileWriter、BufferedReader、BufferedWriter抽象类的根本使用方法。二、实验原理1. 使用FileInputStream、FileOutputStream、FileReader、FileWriter、BufferedReader、BufferedWriter抽象类实现从文件中读取内容,并添加所想要输入的内容,接着一行一行输入到

27、另一个文件中。2. 实现给出的Java Application程序,并分析其功能。3. 现有如下格式的成绩单文本格式score.t*t::*三,数学72分,物理67分,英语70分.:李四,数学92分,物理98分,英语88分.:周五,数学68分,物理80分,英语77分.要求按给定的程序模板编写一个Java程序,能按行读入上述格式的成绩单,并在该行的后面尾加上该同学的总成绩,然后再将该行写入到一个名字为socreAnalysis.t*t的文件中。三、使用硬件、软件环境硬件环境:i5-7200U+8G内存+256G硬盘软件环境:Windows 10操作系统开发工具:Eclipse四、实验过程、步骤及

28、原始记录(算法、原程序、测试结果,分析等)1该程序的功能是通过处理字节流的抽象类:InputStream和OutputStream完成文件的复制:先使用字节流从copyFile.java文件中读取数据,接着将读取到的数据写入到temp.t*t文件中去,实现copy功能。源代码:import java.io.*;publicclass CopyFile publicstaticvoid main(String args) try FileInputStream fis = new FileInputStream(src/CopyFile.java); FileOutputStream fos =

29、 new FileOutputStream(temp.t*t);intread = fis.read();while ( read != -1 ) fos.write(read);read = fis.read(); fis.close();fos.close(); catch (IOE*ception e) System.out.println(e); 运行结果:2.AnalysisResult.java源代码:import java.io.*;importjava.util.*;publicclass AnalysisResultpublicstaticvoid main(String a

30、rgs)File fRead=new File(score.t*t);File fWrite=new File(scoreAnalysis.t*t);tryWriter out= new FileWriter(fWrite,true);/以尾加方式创立指向文件fWrite的out流BufferedWriter bufferWrite=new BufferedWriter(out); /创立指向out的bufferWrite流Reader in=new FileReader(fRead); /创立指向文件fRead的in流BufferedReader bufferRead=new Buffere

31、dReader(in); /创立指向in的bufferRead流String str=null;while (str=bufferRead.readLine()!=null)doubletotalScore =Fen*i.getTotalScore(str);str=str+总分:+totalScore;System.out.println(str);bufferWrite.write(str);bufferWrite.newLine();bufferRead.close();bufferWrite.close();catch(IOE*ception e)System.out.println(

32、e.toString();Fen*i.java源代码:import java.util.*;publicclass Fen*ipublicstaticdouble getTotalScore(String s)Scanner scanner=new Scanner(s);scanner.useDelimiter(0123456789.+);doubletotalScore=0;while(scanner.hasNe*t()trydoublescore=scanner.ne*tDouble();totalScore=totalScore+score;catch(InputMismatchE*ce

33、ption e*p)String t=scanner.ne*t();returntotalScore;运行结果:记事本信息:五、实验结论、分析、思考题与心得体会通过本次实验,我对于Java语言关于输入输出流的局部有了一定的了解,下面是我的一些收获:1. 掌握Java I/O根本原理:Java中的IO包中的类可以处理不同类型的流,例如:字节流(byte)、字符流character、文件流、对象流等。java.io中的抽象类包括:处理字节流的抽象类:InputStream和OutputStream,处理过滤流的抽象类:FilterOutputStream和FilterInputStream,处理字

34、符流的抽象类:Reader和Writer,处理压缩流的抽象类:InflaterInputStream和DeflaterOutputStream2.学会如何使用Java给出的各种输入输出流来实现一系列的问题,包括:从文件的读取数据、使用输出流对数据进展加工存储到文件中等。3.掌握了FileInputStream、FileOutputStream抽象类的根本使用方法,并实际操作实现了读取与存储拷贝。4.掌握了FileReader、FileWriter、BufferedReader、BufferedWriter抽象类的根本使用方法,实现修改读取的内容,添加内容存储进入文件中。实验四基于GUI的网络通

35、信程序设计学院信息工程系专业班级*成绩课程名称Java技术实验工程名 称实验四基于GUI的网络通信程序设计指导教师教师评语 教师签名: 年 月 日一、实验目的1. 掌握Java中GUI程序的编写,包括事件监听机制。2. 掌握Java的网络通信编程,ServerSocket,Socket类的使用。3. 掌握Java中多线程的编程,Thread类,Runnable接口的使用。4. 掌握用面向对象的方法分析和解决复杂问题。二、实验原理使用JavaSwing中的组件实现GUI程序的编写,包括使用监听器、ServerSocket,Socket类实现输入输出数据。同时使用Thread类,Runnable接

36、口,实现多线程执行程序。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字样,并与客户端建立S

37、ocket连接。3当图1所示的效劳器端和图2所示的客户机端建立Socket连接后,编程实现这两端的数据通信,每次将接收到对方的数据追加显示在多行文本框中。三、使用硬件、软件环境硬件环境:i5-7200U+8G内存+256G硬盘软件环境:Windows 10操作系统开发工具:Eclipse四、实验过程、步骤及原始记录(算法、原程序、测试结果,分析等)1、编写两个文件Client.java 与Server.java,两个Java文件的内容相似,首先在构造方法中写了调用了实现GUI的函数,即使用 JFrame类建立窗口,以及参加相应的组件,使用FlowLayout布局,也为按钮注册了监听器。在不同的

38、内部类中写了不同监听器所调用的actioPerformed()方法。通过写一个主类,与一个实现类,主类通过创立实现类的对象来调用其构造方法来实现功能。实现类中包括各种方法与内部类通过方法的层层调用,来实现所需要的结果。2、在效劳器中创立ServerSocked对象来承受客户端的连接请求,并指定端口号,客户端通过Socket对象与客户端的Socket对象连接。连接成功后通过IO流来通信,效劳器的输入流是客户端的输出流,效劳器的输出流是客户端的输入流,通过BufferedReader读取相应套接字 socket 中获取的输入流的内容,并放入对应的文本框中。效劳器代码:import java.awt

39、.*; import java.awt.event.*; import java.util.*; import java.io.*; import .*; import java*.swing.*; publicclass Server publicstaticvoid main(String args) MyFrame serve = new MyFrame(); serve.setTitle(效劳器);serve.setVisible(true); serve.setResizable(false); /设置此窗体是否可由用户调整大小serve.setDefaultCloseOperati

40、on(JFrame.E*IT_ON_CLOSE); /设置默认关闭操作 classMyFramee*tends JFrame JTe*tField port; utton start; JTe*tArea content; JTe*tField cin; utton say; Socket socket; MyFrame() init(); StartListen sListen = new StartListen(); SayListen stListen = new SayListen(); start.addActionListener(sListen); /为按钮 start 注册一个

41、监听器say.addActionListener(stListen); /为按钮 say注册一个监听器 void init() setLayout(new FlowLayout(); /设置窗体为流式布局setSize(400,400); setLocation(400,100); add(new JLabel(Port:); port = new JTe*tField(8888,25); add(port); start = new utton(Start); add(start); content = new JTe*tArea(15,35); JScrollPane scroll = n

42、ew JScrollPane(content); /设置滚动条add(scroll); add(new JLabel(Say:); cin = new JTe*tField(Hello!,26); add(cin); say = new utton(Say); add(say); class StartListen implements ActionListener publicvoid actionPerformed(ActionEvent e) start.setEnabled(false); try ServerSocket s = new ServerSocket(Integer.pa

43、rseInt(port.getTe*t(); / 创立一个效劳器套接字对象 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); /对两个字符串进展拼接

44、ServerThread st = new ServerThread(); /创立一个 ServerThread 对象st,并调用其构造方法st.start(); /启动一个线程,并调用 run方法 catch (E*ception e*) class SayListen implements ActionListener String str; publicvoid actionPerformed(ActionEvent e) try PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc

45、ket.getOutputStream(),true);/ 创立一个打印输出流,形参为从套接字socket 中获取的输出流str=cin.getTe*t(); if(!str.isEmpty() out.println(new Date()+n+str); /打印输出日期和发送的消息 strcontent.append(new Date()+ n me:+str+n); out.flush(); /清空缓存区cin.setTe*t(); catch (E*ception e*) class ServerThread e*tends Thread publicvoid run() try Buf

46、feredReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(); /创立一个缓冲输出流,其形参为从套接字 socket 中获取的输入流String str; while(true) str = in.readLine(); /按行读取content.append( str+n); catch (E*ception e*) 客户端代码:import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*;

47、import .*; import java*.swing.*; import; publicclass Client publicstaticvoid main(String args) MyFrame client=new MyFrame(); client.setTitle(客户端);client.setVisible(true); client.setResizable(false); /设置此窗体是否可由用户调整大小client.setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE); / 设置关闭操作 classMyFramee*tends J

48、Frame JTe*tField ip; JTe*tField port; JTe*tField cin; JTe*tArea content; utton connect; utton say; Socket socket; MyFrame() init(); ConnectListen cListener=new ConnectListen(); SayListen sListener = new SayListen(); connect.addActionListener(cListener); /注册监听器say.addActionListener(sListener); /注册监听器

49、 void init() setLayout(new FlowLayout(); /设置窗体为流式布局setSize(440,500); setLocation(800,100); add(new JLabel(Server:ip); ip=new JTe*tField(127.0.0.1,8); add(ip); add(new JLabel(Server:port); port=new JTe*tField(8888,8); add(port); connect=new utton(connect); add(connect); content=new JTe*tArea(16,35);

50、JScrollPane scroll=new JScrollPane(content); /设置滚动条add(scroll); add(new Label(Say:); cin=new JTe*tField(你好!,25); add(cin); say=new utton(say); add(say); class ConnectListen implements ActionListener intportNum; publicvoid actionPerformed(ActionEvent e) connect.setEnabled(false); /按下 connect 按钮后, con

51、nect 不可再次点击try content.setTe*t(Connect to server.n); /在文本区中显示 Connect to server.n portNum =Integer.parseInt(port.getTe*t(); /读取 port 文本框中的字符串,并将字符串转化为整型赋给 portNum socket = new Socket(ip.getTe*t(),portNum); /定义对象 socket,并指定主机号host和端口号 portNum ClientThread ct = new ClientThread(); /定义一个 ClientThread 类

52、的对象 ctct.start(); /启动一个线程,并调用ClientThread 类中的 run方法 catch (E*ception e*) class SayListen implements ActionListener String str; publicvoid actionPerformed(ActionEvent e) try PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),true); /从 socket 获取字节输出流,并

53、将其最终转化为 PrintWriter str=cin.getTe*t(); /从文本框中获取字符串赋给 strif(!str.isEmpty() out.println(new Date()+ n+ str); /打印日期和 strcontent.append(new Date()+n me:+str+n); out.flush(); /清空缓存区 cin.setTe*t(); catch (E*ception e*) class ClientThread e*tends Thread publicvoid run() try BufferedReader in = new Buffered

54、Reader(new InputStreamReader(socket.getInputStream(); /创立一个缓冲输出流,其形参为从套接字 socket 中获取的输入流String str; while(true) str = in.readLine(); /按行读取content.append( str+n); catch (E*ception e*) 运行结果:五、实验结论、分析、思考题与心得体会通过本次实验,我对于GUI程序的便编写,以及网络通信与多线程编程有了一定的了解,并且也亲自实现了一个基于GUI的客户-效劳器的通信应用程序,在实验过程中,我也遇到了不少的问题并加以解决:1

55、.因为效劳器的GUI界面有start和say按钮,客户端有connect和say按钮,按钮被点击后会触发动作事件。而不同的按钮要执行不同的操作,也就意味着要写多个actionPerformed方法,可是一个类里面只能写一个actionPerformed方法,因此可以写几个实现了ActionPerformed()方法,在内部类中再写一个actionPerformed方法,这样就写了好几个不同的actionPerformed方法,在注册监听器的时候,按钮需要实现哪种功能,就用哪个内部类的对象来监听就可以了。2.在效劳器中创立 ServerSocket 对象来承受客户端的连接请求, 并指定端口号, 客户端通过Socket 对象来向效劳器的 ip 和端口发送连接请求。效劳器在接到连接请求后,效劳器会创立一个新的 Socket 对象与客户端的 Socket 对象连接。连接成功后通过 IO 流来通信,效劳器的输入流是客户端的输出流,效劳器的输出流时客户端的输入流. z.

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!