课题名称:Hannoi塔
1.1系统介绍
本系统是旨在模拟Hannoi塔运行功能,暂时考虑单机环境下的实现;操作系统选择目前常用的Windows XP/2000。
1.2 设计要求
(见教材,自己书写)
1.3 总体设计
在设计Hannoi塔时,需编写6个Java源文件:HannoiWindow.java、
TowerPoint.java、Disc.java、HandleMouse.java、Tower.java、AutoMoveDisc.java。
类之间的组合关系:
(见教材,自己绘制)
1.3.1 HannoiWindow.java(主类)
(1)功能概述
负责创建Hannoi塔的主窗口,该类含有main方法,Hannoi塔从该类开始执行。HannoiWindows类的成员变量中有五种重要类型的对象、一个int基本型数据和一个char型数组。五种类型的对象分别是:Tower、JmunuBar、Jmenu、JmenuItem和Jbutton对象。
(2)UML图
(见教材,自己绘制)
1.3.2 Tower.java
(1)功能概述
Tower类是javax.swing包中Jpanel容器的子类,创建的容器被添加到HannoiWindow窗口的中心。Tower类的成员变量中有四种重要类型的对象、一个int基本型数据和一个char型数据。四种类型的对象分别是:Disc、TowerPoint、HandleMouse和AutoMoveDisc对象。
(2)UML图
(见教材,自己绘制)
1.3.3 Disc.java
(1)功能概述
Disc类是Jbutton的一个子类,创建的对象是Tower容器中的一个按钮,用来表示Tower中的“盘子”。
(2)UML图
(见教材,自己绘制)
1.3.4 TowerPoint.java
(1)功能概述
TowerPoint类负责在Tower中创建表示位置的塔点对象。
(2)UML图
(见教材,自己绘制)
1.3.5 HandleMouse.java
(1)功能概述
HandleMouse类创建的对象负责处理鼠标事件。
(2)UML图
(见教材,自己绘制)
1.3.6 AutoMoveDisc.java
(1)功能概述
AutoMoveDisc类创建的对象负责自动移动盘子从一个座到另一个座。
(2)UML图
(见教材,自己绘制)
1.4 详细设计
代码详见上交源文件。
课题名称:根据自己选做课题书写
1.1系统介绍
自己书写
1.2 设计要求
自己书写
1.3 总体设计
整个系统包含的Java源文件:根据选题书写
类之间的组合关系:
(根据选题,见教材,自己绘制)
根据分组分工,书写要求如下:
1) 自己编写的.java源文件的功能概述
2) 绘制源文件对应UML图
3) 写出图中有关数据和方法的详细说明。
1.4 详细设计
代码详见上交源文件。
实训总结
结合实训体会自己撰写
第二篇:Java聊天系统实训报告
Java聊天系统实训报告
一、实训目的:
1、理解C/S模式的软件系统结构,掌握网络编程的基本概念;
2、了解Java 的多线程机制,掌握Java多线程技术的应用;
3、熟练掌握基于TCP协议的Socket编程;
4、熟练掌握基于UDP协议的Socket编程;
5、了解Socket编程的协议约定以及信息交互方法;
二、实训要求:
使用JBuilder提供的组件及网络包,开发一个实用的C/S模式聊天室系统。
(1) 功能要求
要求该系统由客户端及服务器端两部分组成。
(2) 系统界面要求:
要求系统具有友好的用户界面,界面简洁、操作方便;
本程序客户端主要完成了:
1. 客户端发送信息可以广播客户。
2. 广播客户,则将信息转发到所有客户端。
服务器主要完成了:
客户-服务器之间信息的交互。例如hello发送信息到服务器,服务器将信息转发到所有与之连接的客户(hello、boy),通过这种形式,就可以实现客户之间的信息广播。
本程序可以实现发送信息广播,只要进入客户端都可以看到消息,本程序采用了流的概念,java多线程,Socket应用
程序中用到的代码如下
客户端代码:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
publicclass Login implements ActionListener{
privatestaticfinal ActionListener WindowAdapter = null;
private Frame f;
private TextField tf;
private Label l;
private String tfContent="";
public Login()
{
f = new Frame("欢迎登陆本程序...按enter键直接登录");
l = new Label("请输入你的名字");
tf = new TextField(20);
f.setLayout(new FlowLayout());
f.add(l);
f.add(tf);
f.pack();
f.show();
tf.addActionListener(this);
f.addWindowListener(new WindowAdapter()
{
publicvoid windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
publicvoid actionPerformed(ActionEvent e){
System.out.println ("ft clicked");
tfContent = tf.getText();
ClientFrame cf = new ClientFrame(tfContent);
f.dispose();
}
publicstaticvoid main(String[] args){
new Login();
}
}
class ClientFrame extends Thread implements ActionListener{
private Frame f;
private TextField tf;
private Button btn;
TextArea ta;
private Panel pup;
String data;
BufferedReader InputS;
PrintStream OutputS;
String name;
ClientFrame(String str){
name = str;
Socket client;
try {
client = new Socket("localhost",6000);
InputS = new BufferedReader(new InputStreamReader(client.getInputStream()));
OutputS = new PrintStream(client.getOutputStream(),true);
}
catch (Exception ex) {
ex.printStackTrace();
}
OutputS.println("欢迎" + name + "光临");
f = new Frame("客户端");
tf = new TextField(30);
tf.addActionListener(this);
btn = new Button("发送");
ta = new TextArea();
pup = new Panel();
f.setLayout(new BorderLayout());
f.add(pup,BorderLayout.NORTH);
pup.add(tf);
pup.add(btn);
f.add(ta);
f.pack();
f.setSize(400,300);
f.addWindowListener(new WindowAdapter(){
publicvoid windowClosing(WindowEvent e){
OutputS.println(name + "已经离开");
System.exit(0);
}});
btn.addActionListener(this);
f. show();
this.start();
}
public void run(){
try {
while(true){
System.out.println ("正在监听端口...");
OutputS.println("\u0001");
ta.setText(InputS.readLine().replaceAll("\u0001","\n"));
Thread.sleep(1000);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
publicvoid actionPerformed(ActionEvent e){
String cmd = e.getActionCommand();
if (cmd.equals("发送")){
System.out.println ("发送 clicked");
data = tf.getText();
try {
OutputS.println(name + "说:" + data);
ta.setText(InputS.readLine().replaceAll("\u0001","\n"));
}
catch (Exception ex) {
ex.printStackTrace();
}
tf.setText("");
}
else{
System.out.println ("发送 clicked");
data = tf.getText();
try {
OutputS.println(name + "说:" + data);
ta.setText(InputS.readLine().replaceAll("\u0001","\n"));
}
catch (Exception ex) {
ex.printStackTrace();
}
tf.setText("");
}
}
}
运行结果如下图:
服务器代码如下:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.ArrayList;
publicclass ServerFrame implements ActionListener
{
private Frame f;
private TextArea ta;
private MenuBar mb;
private MenuItem start;
private Menu m;
boolean isStop;
static ArrayList clients;
ServerFrame() {
f = new Frame("java聊天系统服务器");
ta = new TextArea();
mb = new MenuBar();
m = new Menu("服务器管理");
start = new MenuItem("启动服务器");
mb.add(m);
m.add(start);
start.addActionListener(this);
f.setMenuBar(mb);
f.add(ta);
f.setSize(260, 60);
f.addWindowListener(new WindowAdapter() {
publicvoid windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.show();
}
publicvoid actionPerformed(ActionEvent e)//该方法用来对发生在按钮上的事件进行处理
{
String cmd = e.getActionCommand();
if (cmd.equals("启动服务器")) {
System.out.println("初始化中...");
try {
System.out.println("服务器已经启动");
ServerSocket server = new ServerSocket(6000);
while(!isStop){
Socket Client = server.accept();
Service ss = new Service(Client);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
publicstaticvoid main(String[] args) {
new ServerFrame();
}
}
class Service extends Thread{
String data;
BufferedReader InputS;
PrintStream OutputS;
Socket Client;
static String Content="";
public Service(Socket ClientSocket) throws Exception{
Client = ClientSocket;
try {
InputS = new BufferedReader(new InputStreamReader(Client.getInputStream()));
OutputS = new PrintStream( Client.getOutputStream(),true);
}
catch (Exception ex) {
System.out.println("不能连接客户端 !");
return;
}
this.start();
}
publicvoid run() {
System.out.println (this);
try {
while(true){
data = InputS.readLine();
if(data.equals("\u0001")){
OutputS.println(Content);
}else{
Content = data +"\u0001"+ Content ;
System.out.println (Content);
if (Content==null) break;
else{
OutputS.println(Content);
System.out.println("From Client: " + Content);
}
}
}
Client.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
try {
Client.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
运行结果如下图:
实验中遇到的问题:
1、图形用户界面设计按钮和文本框设计中的按钮上的事件处理问题
2、输入流输出流的问题
3、监听端口的问题
解决:1、通过java语言程序设计(第2版)中第五章中的5.2事件和事件处理知道了具体事件的处理是使用事件对应的监听者接口中所提供的抽象方法,这些方法需要重新定义,例如本程序中publicvoid actionPerformed(ActionEvent e),该方法用来对对发生在按钮上事件的处理。通过学习终于解决了问题。
2、InputStreamReader缓冲处理流通信双方需要建立Socket连接,本程序中Socket包含两个流一个输出流向外发送数据,一个输入流接收数据
3、通过第10章10.5小节Socket应用知道了监听端口是引用Socket构造方法,指定了服务器程序中其监听的端口,还需抛出异常。
实验总结:通过本实训学习基本上把本学期书本上的知识都应用到了,当学习了书本上的知识应用到实际中才发现远没有那么简单,一个看似简单的程序其实需要坚实的理论知识,在这次实训中我学到了很多新知识,其实这些都是书本上的知识,做完这个程序我知道了一定要有坚实的理论基础要扎实才能把程序做好。