首页 软件工程实践校外实习报告

软件工程实践校外实习报告

举报
开通vip

软件工程实践校外实习报告软件工程实践校外实习报告 郑 州 轻 工 业 学 院 实习名称: 软件工程实践 姓 名: 鲁雪颖 院 (系): 软件学院 专业班级: 软件卓越12-01 学 号: 541213440128 指导教师:朱凯 甄磊 徐洁 殷知磊 黄艳 邓璐娟 主要实习单位: 上海 杰普 成 绩: 时间: 2014 年 6月 23 日至 2014 年 7 月 18 日 1 实习成绩评定表 实 习 单 位 实习单位指导技术人员评语 签名 成绩 总成绩: 指导教师评语 2 目录 1、概要„„„„„„„„„...

软件工程实践校外实习报告
软件工程实践校外 实习报告 酒店前台实习报告法院实习报告铁路实习报告链家实习报告寒假实习报告 郑 州 轻 工 业 学 院 实习名称: 软件工程实践 姓 名: 鲁雪颖 院 (系): 软件学院 专业班级: 软件卓越12-01 学 号: 541213440128 指导教师:朱凯 甄磊 徐洁 殷知磊 黄艳 邓璐娟 主要实习单位: 上海 杰普 成 绩: 时间: 2014 年 6月 23 日至 2014 年 7 月 18 日 1 实习成绩评定表 实 习 单 位 实习单位指导技术人员评语 签名 成绩 总成绩: 指导教师评语 2 目录 1、概要„„„„„„„„„„„„„„„„„„„„„„„„„„4 1.1实践时间„„„„„„„„„„„„„„„„„„„„„„„4 1.2主要学习内容„„„„„„„„„„„„„„„„„„„„„„4 1.3实习指导老师„„„„„„„„„„„„„„„„„„„„„4 1.4“软件工程实践”项目任务书„„„„„„„„„„„„„„5 1.5实践计划(半天版)„„„„„„„„„„„„„„„„„„附2 2、实践内容„„„„„„„„„„„„„„„„„„„„„„„„8 2.1 Linux技术„„„„„„„„„„„„„„„„„„„„„„8 2.2 CoreJava技术„„„„„„„„„„„„„„„„„„„„„9 3、项目练习„„„„„„„„„„„„„„„„„„„„„„„„14 3.1 项目1:计算器项目„„„„„„„„„„„„„„„„„„14 3.2项目2:简易版聊天室项目„„„„„„„„„„„„„„„22 4、实习总结„„„„„„„„„„„„„„„„„„„„„„„„36 3 1.概要: 1.1实践时间(2014年6月23日至2014年7月18日) 1.2主要学习内容 1)Linux操作系统技术 2)CoreJava技术 3)项目内容(计算器 简易版聊天室) 1.3实习指导老师 朱凯、甄磊、徐洁、殷知磊、黄艳、邓璐娟 1.4“软件工程实践”项目任务书(附1) 1.5实践计划(半天版)(附2) 4 附1: 郑州轻工业学院软件学院 学生实践任务书 一、题目 “软件工程实践(一)” 二、学生信息 专业 软件卓越12-01 学号 541213440128 姓名 鲁雪颖 三、任务与约束 1、熟练掌握linux操作系统,vi各种命令,在vi中编写java,在linux环境下编写代 码,完成项目。 2. 熟练掌握coreJava的基础知识,真正学会了编程的思想,能够站在代码的角度去看问题,能够独立的完成每个课后练习。 3.利用所学知识,能够独立编写出计算器。 4.利用所学知识,能够完成简易版的聊天室。 5(构思计算器,简易版的聊天室项目,需求分析,系统 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 ,确定项目要实现的功能 6(开始编写代码,实现项目的主要功能 7(测试主要功能,处理Bug。 8(项目验收、完成“软件工程实践报告” 四、设计要求、技术参数及设计规格 1.应用程序提供友好的图形用户界面。 2.应用程序要具备健壮性、稳定性和好的移植性。 3(界面要为用户提供方便的导航。 4.功能要达到老师的要求。 5.允许存在不影响功能的小的bug。 应用程序开发要求: 选用技术:Java软件集成开发环境(IDE):NetBeans、MyEclipse、Eclipse等,在linux下开发。 设计要求: 1、图形用户界面设计:用GUI设计计算器和简易版聊天室系统的界面。 2、功能实现:根据自己需求对计算器和简易版聊天室。 3、设计规格:请根据Java 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 编写。 5 五、进度日历 天/日期 任务描述 通过标准 14年6月23日 上午先熟悉linux。 对linux有更深的了 下午学习linux的一些基本操作。 解,会用命令操作 ubuntu。 14年6月24日 上午学习vi编辑,掌握基本的vi命令。 会熟练使用vi命令编 下午学习网络 ,shell脚本。 辑。 14年6月25日 上午自己再复习下linux,熟悉下corejava 熟练的掌握linux,对 了解编程的思想。 corejava有更深的认 知。 14年6月26日 使自己迅速进入编程的角色。 熟练掌握命名规范 面 掌握命名规范 面向对象 类和对象 变量的分类。 向对象 类和对象 14年6月27日 熟悉 掌握 Array 数组,并熟练应用。 完成 实现发牌器小程 独立完成发牌器 序。 14年6月30日 学习对象和类 知道面向对象编程有三个特性:封装,能够明白封装,多态, 多态,继承 继承,并熟练的应用。 学习构造方法,构造器。 14年7月1日 学习高级语言特性与应用,掌握static final 独立完成针对各个模 学习抽象化编程 接口编程 块的的练习 14年7月2日 学习包装类 集合Collection和Iterator接口 独立完成针对各个模 Set(HashSet TreeSet) 块的的练习 学习List Map(HashMap TreeMap)反射 14年7月3日 学习异常(try„catch throws ) 能够熟练的应用各种 学习Building GUIs 图形用户界面 异常。 14年7月4日 学习使用GUI的四个步奏 能够独立完成计算器 编写个小型计算器 的编写 14年7月7日 验收计算器 验收结束 14年7月8日 学习线程 线程新建和启动 熟练创建和使用线程。 14年7月9日 线程状态(就绪、运行、死亡、阻塞) 独立完成课后针对作 线程调度 线程的两大操作(并发 同步 业 14年7月10日 学习对象序列化 ;反序列化 能够熟练地掌握各种 下午:学习各种输入 输出流 输入 输出流 14年7月11日 Network(socket server client server) 独立完成课上针对该 下午:要求根据前面所学内容做一个:简易版的聊天模块的练习。开始构思 室 简易版的聊天室 6 14年7月14日 项目准备阶段:项目概要设计和详细设计,确定项目完成项目计划书中的 要实现的功能 项目需求和系统设计 14年7月15日 根据需求分析:设计好服务端和客户端的页面。 完成聊天室的服务端 和客户端的GUI页面。 14年7月16日 根据页面逐步完善功能: 完成在服务端和客户 编写服务端的sokect和客户端的serversocket,逐端点击send按钮,信 步给服务端和客户端的send和star按钮加上监听 息能在各自的 showarea 中显示出来 14年7月17日 逐步完善服务端和客户端的线程,项目大致已经完成保证了服务端客户端 到老师要求。 互相发送的信息能相 对项目进行测试,寻找bug。 互接收到。 没有明显影响软件运 行的错误,界面美观, 代码整齐。 14年7月18日 项目验收 项目验收通过 六、考核形式、考核时间、考核指标及成绩评定 实践成绩由下面构成:学习纪律、学习态度和平时表现占20%;实践结果占30%;实践报告占30%;实践操作能力占20%。 考核形式:1)老师每日对学生的考察、评估和考核;2)最后对实践项目完成的质量进行考核和验收。 完 成 期 限:2014年7月18日 指导教师签章:朱凯、甑磊、徐洁、殷知磊、黄艳、邓璐娟 专业负责人签章: 教学院长签章 14年 6月 15日 7 1、 实践内容 2.1 Linux技术 (1)linux的三大组成部分:keenel shell fill system (2)Shell的操作页面,Shell命令操作计算机,Windows文件操作结构,一些基础命, 元字符,文本操作。 (3)vi编辑器,vi的三种模式,vi的基本命令, grep, 统计 进程。 , vi的三种模式: 命令行模式:默认进入的模式 ( 输入命令,执行相应的操作)。 底行模式:全文操作 (全文保存全文退出全文搜索全文替换)。 输入模式和底行模式是不能直接转换的,要通过命令行模式转换。 , vi的基本命令:(删除,替换,拷贝,保存,查找)。 , 统计: wc [options] filename(s) l ?-l Counts lines l ?-w Counts words ?-C Counts characters (4)网络,Shell 脚本设置,配置初始化环境,umask,bashr,配置java。 , Shell 脚本 建文件: Touch a.sh 进入Vi : vi a.sh #!/bin/sh pwd cal date 权限:chmod a+x filename chmod a+x a.sh 执行:./ filename ./a.sh , 配置初始化环境 环境变量path echo $PATH ls /etc 系统初始化文件 /etc/profile:系统级别的初始化文件 ls –a ~ /home/briup/.bashre: 用户级别的初始化文件 ls –a ~ /home/briup/.profile:用户级别的初始化文件 ls –a ~ /home/briup/bash_.profile: 用户级别的初始化文件 配置java: vi ~/.bashrc 写入:PATH=$PATH/opt/java 1.6.0_24/bin 8 验证:Java –version 2.2 CoreJava技术 (1)Getting Started : , 设置Java开发环境; a. 获取J2SDK; b. 安装J2SDK; c. 设置环境变量:JAVA_HOME,path (2)Identifiers,Keywords,and Types , Comments:注释 // /*-----*/单行注释 /**-----*/文档注释 , Primitive Types in Java:基本数据类型(4类8种) 整型:byte short int long 浮点型:float double 布尔类型Boolean(true false) 单字符字型 char 两个字符:char zhChar = ‘中’; char enChar = ‘a’; char ucChar=‘\u0060’; , 面向对象 类 : class ClassName{ 属性 方法 } (3)Expressions and Flow Control , 变量的分类: 基本数据类型变量 ,引用数据类型变量(类变量) 根据:存储的数据类型 , 操作符: 赋值操作符:= 复合赋值操作符:a+=b----》a=a+b 比较操作符: 基本操作类型比的是之本身 new 就有全新的引用 +:如果前后一个是字符串,那么操作就变成了字符串连接操作 /:整数 取商 有浮点数 近似值 9 %:取余 , 数据类型转换----->当数据的数据类型和存储的变量类型不一致时候 例: int i=10; float f =i; , 语句: if:先判断 后执行, 执行一次字句 over。 switch : break 是case条件值结束代码的关键字,如果没有将继续往下执行 switch 后的类型只能是 byte short int char 死循环 不能有。 For,while,do while (4)Arrays , Declare arrays:申明创建数组 , 遍历 , 二维数组 (5)Objects And Classes , 面向对象编程有三个特性:封装,继承,多态 , 抽象数据类型 , 参数传递 (6)Advanced Language Features , static 静态 , final , abstract , 实现:implement 原来的继承 , final类型 , 抽象化编程 接口编程 , 包装类 作用: 1) 用引用类型表示数值;例如表示一个缺考学生的成绩; 2) 有些场合必须要引用类型;例如集合中只能存储引用类型; 3) 实现基本类型间以及与字符串间转换; , 集合: 由数组的缺点引出集合 Java中集合主要分为三种类型: 1)Set(HashSet, TreeSet) : 无序,并且没有重复对象。 2)List: 有序(放入的先后的次序), 可重复。 3)Map(HashMa, TreeMap) : 集合中的每一个元素包含一对键对象和值对象, 集合中没有重复的键对象,值对象可以重复。 10 , 反射 1) 确定一个对象的class 2) 可以获得一个类的修饰符、字段、方法、构造器和父类。 3) 获得接口声明的常量和方法。 4) 创建Class的实例,直到运行时才获得。 5) 运行前即使字段名字不知道,可以到程序运行时获得和修改这些字段的值。 6) 运行前即使对象的方法名不知道,可以到程序运行时触发调用该方法。 7) 运行前创建了一个大小和元素都未知的新数组,可以到运行时修改数组的元 素。 (7)Exceptions try...catch语句 , throws 抛异常 , Assertion 断言:测试代码时 (8)Building GUIs && The AWT Event Model , 选择容器(Frame Panel) , 选择布局管理器: java.awt包提供了5种布局管理器: 1) FlowLayout流式布局管理器; 2) BorderLayout流式布局管理器; 3) GridLayout流式布局管理器; 4) CardLayout流式布局管理器; 5) GridBagLayout流式布局管理器; , 添加组件 , 给组件添加事件处理 , 事件源 1) 是一个组件或对象,用来产生事件; 2)通过事件源来实例化事件类型对象; 3) 提供方法增加和删除事件监听器 4)维持一系列有兴趣的事件监听器 事件源产生事件后,必须将事件对象传递给事件监听器, 让事件监听器去 处理。因此事件源必须能够访问到事件监听器 对象。如何访问呢,可以将事 件监听器作为事件源的属性或事件监听器数组、集合类型作为事件源的属性; 所谓增加或删除事件监听器无非是修改事件监听器属性的值; 逻辑上包括了创建和传递适当类型的事件对象给所有感兴趣的事件监听器 (9):Threads , 线程新建和启动: 一种: extending the class Thread 二种: implementing the interface Runnable 11 , 线程状态:就绪、运行、死亡、阻塞 线程在它的生命周期中会处于各种不同的状态; 1)新建状态(New) 用new语句创建的线程对象处于新建状态, 此时它和其他Java对象一 样;仅在堆区中被分配了内存; 2) 就绪状态(Runnable) 当一个线程对象创建后,其他线程调用它的start()方法, 该线程就 进入就绪状态,Java虚拟机会为它创建方法调用栈。 处于这个状态的线程位于可运行池中, 等待获得CPU的使用权。 3)运行状态(Running) 处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中, 如 果计算机只有一个CPU, 那么任何时刻只会有一个 线程处于这个状态。如果计算机有多个CPU, 那么同一时刻可以让几个 线程占用不同的CPU,使它们都处于运行状态。只有 处于就绪状态的线程才有机会转到运行状态。 4)阻塞状态(Blocked) 指线程因为某些原因放弃CPU, 暂时停止运行。当线程处于阻塞状态 时,Java虚拟机不会给线程分配CPU,直到线程重新 进入就绪状态,它才有机会转到运行状态。 , 线程的两大操作:并发, 互斥,加锁 (10) :Stream I/O And Files , 对象序列化 ,反序列化 对象的序列化: 把对象写到一个输出流; 对象的反序列化:从一个输入流中读取一个对象; , 字节输入流和输出流概述 文件 输入流 输出流 文件 内存 -------------> Java程序 ------------------> 内存 键盘 控制台 数据源 数据目的地 , 输入流和输出流层级结构 ByteArrayInputStream:把字节数组转换为输入流; FileInputStream: 从文件中读取数据; PipedInputStream: 连接一个 PipedOutputStream; SequenceInputStream: 把几个输入流转换为一个输入流; 12 ObjectInputStream: 对象输入流; FilterInputStream: 过滤器,扩展其它输入流功能; , BufferedInputStream类 , DataInputStream 类 readByte()——从输入流中读取1个字节,指它转换为byte类型的数据; readLong()——从输入流中读取8个字节,指它转换为long类型的数据; readFloat()——从输入流中读取4个字节,指它转换为float类型的数据; readUTF()—— 从输入流中读取1到3个字节,指它转换为UTF-8字符编码 的字符串 , 管道输入类:PipedInputStream 类 , InputStreamReader类 , FileReader类 FileReader(File file): 参数file指定需要读取的文件; FileReader(String name): 参数name指定需要读取的文件的路径; , BufferedReader类 , File类 , FileInputStream and FileOutputStream , FileReader and FileWriter , PrintWriter (11):Networking , Server 开启服务-->产生端口 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。 ServerSocket ss=new ServerSocket (8888); 死循环,机器不断运行 while(true) { Socket socket =ss.accept();} 用输入流包装 , client import java.awt.*; public void actionPerformed(ActionEvent e){ Socket socket =new Socket("localhost",8888); //链接端口 13 3、项目练习 3.1项目1:计算器项目 3.1.1问题描述或需求分析: 1)运算器功能需求 用户能够完成四则混合运算加减乘除,并且运算器能够自动的识别运算符的优先级,根据输入的运算公式,自动计算出相应的结果。同时完成运算器中的 Baclspace.ce按钮,能够完成消除或者删除的功能。 2)出错处理需求 当用户如果按下的是除零的操作,显示框将显示“被除数不为0”;当用户如果连续多次按下运算符,运算器自动记忆第一次运算符,并且做防连续输入相同的运算符或者是不同的运算符。当用户在同一个数据中多次输入小数点,运算器能够自动判断小数点重复,自动只记忆第一个小数点。当用户在同一个数据中输入多个负号,运算器能够自动做重复检查,不显示多余的负号。当用户在使用backspace功能删除越界数据时候,运算器自动作相应的处理。 3)数据处理需求 在程序的起始,建立两个栈,分别用来存储操作数和操作符。在运算器的核心运算代买中,运用这两个栈来实现算法中的优先级的处理,使用“#”号来标记计算公式的结束。目标计算公式通过运算器的键盘实现输入,当按下“=”号之后,运算器通过调用运算器核心函数来实现数据的处理。 3.1.2问题求解设计 1)系统总体分析: 对于此次运算器程序,首先设计其GUI界面,总体界面有一个文本框,总界面用BoderLayout布局。文本框放置到一个面板Panel中,添加到整体布局的中心,界面设计完成。布局设计好后再添加按钮事件。对于此程序考虑到点击加减乘除按钮时是否点击数字按钮,如果是第一次点击数字按钮或者是点击数字按钮前点击了加减乘除按钮则直接把数字按钮的数值设置到文本框中,否则应把文本框中的内容加上用户所点击按钮的数值设置到文本框中。在进行加、减、乘、除计算时点击加、减、乘、除按钮之前的数值保存下来,运算时是这个被保存下来的数值和文本框中的数值加、减、乘、除。 2)系统界面部分 : 主窗体包含的控件中要有:标签,用于显示提示语句; 文本文档,用于用户数值的;按钮键,用于处理操作。界面初始化时,将一些按键,例如完成加、减、乘、除运算按键设置成不可用,这样可以防止误操作,每次按钮按下时,都有相应的按钮属性被更改。 3)系统后台部分: 14 后台部分,核心就是产生随即算术式,用一个字符串数组存放加和减的操作符,产 生一个0-9的随机数,通过此随机数对应操作符数组中的字符,决定产生的算术式为 加法或减法,然后进行两个数值的四则运算,通过以上运算求出结果,保存在私有变 量中,同时对应的产生一个通过连接完成的字符串,作为界面题目输出的内容,以上 便完成随机算术式的生成。 4) 运算器总系统功能图: 3.1.3代码编写: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calculate extends JFrame implements KeyListener{ private Container contentPane; private String[] key ={ "7", "8", "9", "c", //声明一个字符串 "4", "5", "6", "+", "1", "2", "3", "-", "0", ".", "=", "*", "%","sqr","<-","/" }; 15 private JButton briup_jb[] = new JButton[key.length]; //声明计算器上的按钮 private JButton briup_jb1,briup_jb2; //声明菜单栏的按钮 private JTextArea briup_jt; private JPanel briup_jp0,briup_jp1,briup_jp2; private StringBuffer bruip_Str; //声明一个字符串变量 private char ch; private boolean briup_bl;//声明一个布尔值 private double x=0,y=0; private String str1="Type wrong"; private String str2="tip"; public Calculate(String title){//主题窗口设置 setTitle(title); setSize(300,200); setDefaultCloseOperation(EXIT_ON_CLOSE); contentPane = getContentPane(); init(); } public void init(){ ch='M'; briup_bl=false; bruip_Str=new StringBuffer(); briup_jp0 =new JPanel(); //菜单栏按钮 briup_jp0.setLayout(new FlowLayout(FlowLayout.LEFT,2,2)); briup_jb1 =new JButton("help!"); briup_jb2 =new JButton("note!"); briup_jp0.add(briup_jb1); briup_jp0.add(briup_jb2); briup_jp1 =new JPanel(); briup_jp2 =new JPanel(); briup_jt = new JTextArea(2,10); briup_jt.setText("0"); briup_jt.addKeyListener(this); briup_jt.setEditable(false); briup_jt.setBackground(Color.white);//设置背景颜色 briup_jp1.setLayout(new BorderLayout(4,1)); briup_jp1.add("Center", briup_jt); 16 briup_jp2.setLayout(new GridLayout(5,4,0,0)); ButtonListener btnListener = new ButtonListener(); for (int i = 0; i < key.length; i++) { briup_jb[i] = new JButton(key[i]); briup_jb[i].addActionListener(btnListener);//注册监听器 briup_jb[i].addKeyListener(this);//添加键盘监听器 briup_jp2.add(briup_jb[i]); } // 运算符键用红色标示 briup_jb[3].setForeground(Color.red); briup_jb[7].setForeground(Color.red); briup_jb[11].setForeground(Color.red); briup_jb[15].setForeground(Color.red); briup_jb[16].setForeground(Color.red); briup_jb[19].setForeground(Color.red); briup_jb[14].setForeground(Color.yellow); contentPane.setLayout(new BorderLayout()); contentPane.add("North",briup_jp0); contentPane.add("Center",briup_jp1); contentPane.add("South",briup_jp2); //把两个面板加入一个盒式布局管理器 setResizable(false); contentPane.setVisible(true); //设置可见 } class ButtonListener implements ActionListener //构造监听器 { public void actionPerformed(ActionEvent e) { //获取事件源的标签 String s = ((JButton)e.getSource()).getText().trim(); //得到用户按下的按钮上的文本 char c = s.charAt(0); //得到s中索引为0的字符 if(c == 'c') //选择按钮c { briup_jt.setText("0"); bruip_Str.setLength(0); //设置值为0 ch = 'M'; briup_bl = false; //设置布尔值为假 17 x = 0; y = 0; return; //返回 } if(c == '.') //选择输入小数点 { if( briup_jt.getText().trim().indexOf(".") != -1) return; //判断小数点是否存在 else { bruip_Str.insert(bruip_Str.length(),"."); briup_jt.append("."); //把点加到数字后面 return; } } if(c == '+'||c == '-'||c == '*'||c == '/'||c == '=') //按加减乘除或等号键 { Caculate(c); return; } briup_jt.setText(bruip_Str.append(s).toString()); //剩下的数字键 briup_bl=true; } } public void keyTyped(KeyEvent ek) //实现键盘监听器 { char c = ek.getKeyChar(); //获取键盘上按的值 if(c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9'||c=='0') //按数字键 { briup_jt.setText(bruip_Str.append(c).toString()); //把文本框里的内容转变成String类 briup_bl=true; return; } if(c =='.') //按小数点 18 { if(briup_jt.getText().trim().indexOf(".") != -1) return; else { bruip_Str.insert(bruip_Str.length(),"."); briup_jt.append("."); return; } } if((int)c == KeyEvent.VK_DELETE ) //按删除键 { briup_jt.setText("0"); //设置文本框里的内容为0 bruip_Str.setLength(0); ch = 'M'; briup_bl = false; x = 0; y = 0; return; } if(c == '+'||c == '-'||c == '*'||c == '/'||c == '=') //按加减乘除键 { Caculate(c); //调用Caculate } if(c == '=') //按等号键 { Equal();//调用Equal } } public void keyPressed(KeyEvent ek) {} public void keyReleased(KeyEvent ek) {} public void Caculate(char c) //实现Calculate方法 { if(briup_bl==true && ch != 'M') //判断是否要运算 { y = Double.parseDouble(briup_jt.getText().trim()); //取值去掉左右两边的空格并转换成双精度浮点数 switch(ch) 19 { case '+' : x = x+y; break; case '*' : x = x*y; break; case '-' : x = x-y; break; case '/' :if(y != 0) x = x/y; else { JOptionPane.showMessageDialog(null, str1, str2,JOptionPane.ERROR_MESSAGE);return;//错误提示,除数不能为0 } } briup_jt.setText(""+x); briup_bl = false; } else x = Double.parseDouble(briup_jt.getText().trim()); //取值去掉左右两边的空格并转换成双精度浮点数 bruip_Str.setLength(0); //设置长度为0 y = 0; ch = c; } public void Equal(){ //Equal方法实现 y = Double.parseDouble(briup_jt.getText().trim()); switch(ch) { case '+' : x = x+y; break; case '-' : x = x-y; break; case '*' : x = x*y; break; case '/' :if(y != 0) x = x/y; else { JOptionPane.showMessageDialog(null, str1, str2,JOptionPane.ERROR_MESSAGE);return;//错误提示 } } briup_jt.setText(""+x); briup_bl=false; } 20 public static void main(String args[]) { Calculate cal = new Calculate("broken girls -ver 1.0 by1901&1903 "); cal.setVisible(true); } } 3.1.4项目测试与调试: 1)测试 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 程序正常的响应按钮事件,输入的数值长度受变量length的限定,进行混合四则运算的时候,结果如果不是很大,可以正常显示,但如果很大,就可能采用科学记数方式,这样带来了进制转换时的麻烦,需要特殊的处理科学记数里的E,当结果太大的时候,有可能超出可能表示最大值(结果溢出),这个时候就要对结果进行必要的异常处理,我在输出结果的方法内设置if语句,如果结果大于某一值就抛出一个输出值太大的类,再使用try-catch,捕捉输出结果的方法抛出的异常对象,然后进行重制归零的处理。 3.1.5运行效果: 运行calculator.java时结果如下: 结果分析:在进入页面后,就可以实现运算,例如(8+8-4+6)*4=72.0 21 3.2项目2:简易版聊天室项目 3.2.1问题描述或需求分析: 本系统所要实现的主要功能是为广大用户提供一个借助网络进行人际交往的平台。 因为服务端采用多线程,所以性能有很大提升。因为服务端和客户端之间采用 TCP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 进行网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。 主要用例分析 服务器端的主要功能如下: 1) 在特定端口上进行侦听,等待客户端连接 2) 用户可以配置服务端的侦听端口,默认端口为8888. 3) 向已经连接到服务端的用户发送系统消息。 4) 统计在线人数 5) 当停止服务时,断开所有的用户连接。 客户端的主要功能如下: 1) 连接到已经开启的聊天服务的服务端。 2) 用户可以配置要连接服务器端的IP地址和端口号。 3) 用户可以配置连接后显示的用户名。 4) 当服务器端开启的时候,用户可以随时登录和注销。 5) 用户可以向所有人或者某一个人发送消息。 3.2.2问题求解设计: 1) 设计方法: 界面:用GUI编写。 在设计简单聊天室时,需要编写两个个Java源文件:Server.java、Client.java。 2) 代码构造如图: Server.java public Server() 在该构造器里完成界面的编写 public void ServerSocket() ServerSocket方法完成一个侦听的工作, 并为建立连接的客户端增加线程 class Send extends Thread 服务端发送信息的线程 class Recive extends Thread 服务端接受信息的线程 22 Client.java public Client() 在该构造器里完成界面的编写 public void ServerSocket() 必须指出服务器端套接字的地址和端口 号,然后就向服务器端提出连接请求,并 为建立连接的客户端增加线程 jbsend.addActionListener(new 客户发送信息 ActionListener() class Recive extends Thread 客户读取信息的线程 3)系统流程图: talkroom 客户端 服务器端 监听器 输入输入接口 接口 输出 输出 接收 发送 接收 发送 结束 23 3.2.3代码编写: Server.java的源码: package com.briup.test; /** * * @author lxy */ import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util.*; import javax.swing.*; public class Server extends JFrame { private JButton jbstart, jbstop, jbonLine, jbclearAll, jbsend; //按钮 private JPanel jp0, jp1, jp2, jp3, jp4, jp5; //面板 private JComboBox jc0, jc1; private static JTextArea jtshow, jtonline, jtchat; private JLabel jlsend, jlmessage; private ArrayList list = new ArrayList(); //线程池 private SimpleDateFormat da = new SimpleDateFormat("HH:mm:ss"); //时间 public Server() { this.setLayout(new BorderLayout()); Font f = new Font("宋体", Font.BOLD, 14); jp0 = new JPanel(); jp0.setLayout(new FlowLayout(FlowLayout.LEFT, 40, 30)); jbstart = new JButton("start"); jbstop = new JButton("stop"); jbonLine = new JButton("onLine"); jbclearAll = new JButton("clearAll"); jp0.add(jbstart); jp0.add(jbstop); 24 jp0.add(jbonLine); jp0.add(jbclearAll); jtshow = new JTextArea("Waitting Client Connect............."); jtshow.setFont(f); jtshow.setEnabled(false); //不可编辑 jtshow.setLineWrap(true); //自动换行 jp2 = new JPanel(); jp2.setLayout(new FlowLayout(FlowLayout.CENTER)); jlsend = new JLabel("send to:"); jc0 = new JComboBox(); jc0.insertItemAt("Client", 0); jc0.setSelectedIndex(0); jp2.add(jlsend); jp2.add(jc0); jp3 = new JPanel(); jp3.setLayout(new FlowLayout(FlowLayout.CENTER)); jlmessage = new JLabel("send message:"); jtchat = new JTextArea(4, 6); jtchat.setLineWrap(true); //自动换行 jbsend = new JButton("send"); jp3.add(jlmessage); jp3.add(jtchat); jp3.add(jbsend); jp4 = new JPanel(); jp4.setLayout(new FlowLayout(FlowLayout.CENTER)); jtonline = new JTextArea("Show who is on Line........"); jtonline.setEnabled(false); //不可输入 jtonline.setLineWrap(true); //自动换行 jp4.add(jtonline); jp5 = new JPanel(); jp5.setLayout(new BorderLayout()); jp5.add("North", jp2); jp5.add("Center", jp3); jp5.add("South", jp4); this.setTitle("服务端"); this.setSize(500, 500); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 25 this.setVisible(true); this.add("North", jp0); this.add("Center", jtshow); this.add("South", jp5); jbclearAll.addActionListener(new ActionListener() { //清空聊天 public void actionPerformed(ActionEvent e) { jtshow.setText(""); } }); ServerSocket(); //调用方法 } public void ServerSocket() { // ServerSocket方法完成一个侦听的工作,并为建立连接的客户端增加线程; SOCKET连接过程:服务器监听,客户端请求,连接确认。 try { ServerSocket ss = new ServerSocket(8000); //产生一个服务器监听 while (true) { System.out.println("等待用户连接~"); Socket socket = ss.accept();// Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。 System.out.println("连接成功:" + socket.getInetAddress()); jtshow.setText("Connet Success......." + socket.getInetAddress()); jtonline.setText(socket.getInetAddress() + "ON LINE..."); list.add(socket); new Send(socket).start(); //线程启动 } } catch (IOException e) { e.printStackTrace(); } } //服务端发送信息的线程 class Send extends Thread { 26 Socket socket; public Send(Socket socket) { this.socket = socket; } public void run() { for (Socket ss : list) { try { final InetAddress user = ss.getInetAddress(); //得到连接的Ip地址 InputStream in = ss.getInputStream(); //连接的端口输入 final OutputStream out = ss.getOutputStream(); //输出给连接的端口 jbsend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { out.write(jtchat.getText().getBytes()); //输出流输向客 户端 String g = jtshow.getText(); //两端传出的字符串 g = g + "\n" + "Me:\t" + da.format(new Date()) + "\n" + jtchat.getText(); jtshow.setText(g); //在服务器上输出 jtchat.setText(""); //清空 out.flush(); //输出流的方法,清空缓冲区 } catch (IOException e1) { e1.printStackTrace(); } } }); out.write("Hello..You can talk...".getBytes()); //输出流输向服务端 out.flush(); jtchat.setText(""); new Recive(in, user.toString()).start(); } catch (IOException e) { e.printStackTrace(); 27 } } } } class Recive extends Thread { InputStream in; String user; public Recive(InputStream in, String user) { this.in = in; this.user = user; } public void run() { try { while (true) { byte[] b = new byte[in.available()]; //byte[] b = new byte[1024]; //写一个缓冲大小 in.read(b); //读取客户端输入的内容 String str = new String(b); if (str.length() != 0) { String g = jtshow.getText(); g = g + "\n" + user.toString() + ":\t" + da.format(new Date()) + "\n" + str; jtshow.setText(g); System.out.println(str.length()); System.out.println(str); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); 28 } //} } } public static void main(String[] args) { new Server(); } } Client.java的源码 package com.briup.test; /** * * @author lxy */ import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util.*; import javax.swing.*; public class Client extends JFrame { private JTextField jtname; private JButton jblogin, jbexit, jbonLine, jbclearAll, jbsend; private JPanel jp0, jp1, jp2, jp3, jp4, jp5; private JComboBox jc1; private JTextArea jtshow, jtchat, jtonline; private JLabel jlsend, jlmessage; private JScrollPane jsmessage; private SimpleDateFormat da = new SimpleDateFormat("HH:mm:ss"); private Socket s; 29 public Client() { this.setLayout(new BorderLayout()); Font f = new Font("宋体", Font.BOLD, 14); jp0 = new JPanel(); jp0.setLayout(new FlowLayout(FlowLayout.CENTER)); jblogin = new JButton("login"); jbexit = new JButton("quiet"); jp0.add(jblogin); jp0.add(jbexit); jtshow = new JTextArea(); jtshow.setFont(f); jtshow.setEnabled(false); jtshow.setLineWrap(true); //自动换行 jp2 = new JPanel(); jp2.setLayout(new FlowLayout(FlowLayout.CENTER)); jlsend = new JLabel("name:"); jtname = new JTextField(10); jp2.add(jlsend); jp2.add(jtname); jp3 = new JPanel(); jp3.setLayout(new FlowLayout(FlowLayout.CENTER)); jlmessage = new JLabel("sed message"); jtchat = new JTextArea(4, 6); jtchat.setLineWrap(true); //自动换行 jc1 = new JComboBox(); jc1.addItem("Smile"); jc1.addItem("Happy"); jc1.addItem("Soft"); jc1.addItem("Angry"); jc1.addItem("***"); jbsend = new JButton("send"); jp3.add(jlmessage); jp3.add(jtchat); jp3.add(jc1); jp3.add(jbsend); jp4 = new JPanel(); 30 jp4.setLayout(new FlowLayout(FlowLayout.CENTER)); jtonline = new JTextArea(); jtonline.setEnabled(false); jtonline.setLineWrap(true); //自动换行 jp4.add(jtonline); jp5 = new JPanel(); jp5.setLayout(new BorderLayout()); jp5.add("North", jp2); jp5.add("Center", jp3); jp5.add("South", jp4); this.setTitle("客户端"); this.setSize(500, 500); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.add("North", jp0); this.add("Center", jtshow); this.add("South", jp5); ServerSocket(); //调用方法 } public void ServerSocket() { try { s = new Socket("localhost", 8000);//必须指出服务器端套接字的地址和端口号, 然后就向服务器端提出连接请求。 InputStream in = s.getInputStream(); final OutputStream out = s.getOutputStream(); new Receive(in).start(); //启用线程 jbsend.addActionListener(new ActionListener() { //客户发送信息 public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub try { out.write(jtchat.getText().getBytes()); 31 String g = "\n" + "Me:\t" + da.format(new Date()) + "\n" + jtchat.getText(); jtshow.setText(g); jtchat.setText(""); out.flush(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { new Client(); } //读取信息的线程 class Receive extends Thread { InputStream in; public Receive(InputStream in) { this.in = in; } public void run() { try { while (true) { byte[] b = new byte[in.available()]; //byte[] b = new byte[1024]; in.read(b); String str = new String(b); if (str.length() != 0) { String g = "Server:\t" + da.format(new Date()) + "\n" + str; 32 jtshow.setText(g); } try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 3.2.4项目测试与调试: 按功能模块结构设计菜单,布置各明细模块工作界面,编写各个模块的程序代码,进行编译连接运行,经过反复调试修改,以达到系统功能要求。这个过程具有大量的工作量,应仔细对每个程序细节进行分析思考、编写程序并调试,做到程序简洁清楚,尽量避免可能潜在的程序错误,并在必要的地方加以注释,以便于程序阅读和修改。 33 3.2.5结果和结论: 首先运行启动服务器的文件Server.java,运行结果如下: 图1服务端开启界面图 结果分析:在进入聊天室之前必须先启动服务器,实现服务器端的连接为客户端的连接打开“窗口”。 其次运行客户端文件Client.java,运行结果如下 图2客户端开启,服务端,客户端界面图 34 结果分析:当服务器启动客户端也连接时,在服务期端的界面中会显示当前客户端连接 成功,并且提示客户已连接到服务器,可以进行聊天行为。 服务端和客户端聊天的界面图: 图3服务端开启客户端聊天界面图 结果分析:当客户端连接上服务端时,用户可以在发送信息的文本框里填写自己的内容,点击“发送信息”按钮,信息会出现在上方的区域内并且发送给服务端显示在服务端上方的区域内。 当服务端关闭时,客户端将无法进行聊天。 35 4、实习总结 这次实习我感觉有很多地方值得称赞的,一方面我们借助于杰普实训的机会学习了嵌入式linux系统,另一方面我们通过来昆山软件园体验了现代科技产业园区的学习和工作氛围,为我们将来的工作开拓思路。这里我想需要总结一些有意义的事情。 1)软件学习我们需要持久的兴趣和积极的动手能力。 讲师开始讲授于Linux语言的语法规则时,很多同学们都以为这个很简单,但是听了一会儿就迷糊起来,东西很多记不住,死记硬背又不可取,最初两天确实很郁闷。然而要使用Linux语言这个工具解决实际问题,又必须掌握它,所以只能即在笔记上回来自己慢慢消化。从此可见,我们学习软件尤其是这种工具型知识时,必须端正态度,学习加强记忆,通过时间来逐步加强和获得提高。 2.)实践出真知,只有亲身实践才能对知识的理解更加深刻。 有了完整的程序,但不能认为实践上就可以万事大吉。实际上机运行时可能不断出现麻烦。我们在最后的程序开发中遇到各种各样的问题,必须请老师帮忙。在Linux系统开发计算器和简易版聊天室时出现各种各样的错误比如权限不够,编译环境不对等各种错误。这其中有时程序本身不存在错误,在这个环境下也可以顺利运行,但是在另一种特定的环境变量下就是错误的或者权限不够的。经由过程这次一个月的实习,我们了解了一些关于Linux系统和嵌入式的常识,理解巩固了我们Linux系统的常识,这对我们将来到社会工作将会有莫大的帮助。同时它让我知道,只要你努力,任何东西都不会太难。 3)关于团队的问题 本次实习对我感触最深的是关于团队的理解,在做计算器时朱老师让我们分成小组最后展示自己组的产品,我觉得这在将来在工作中会很有用。 4) 我对昆山软件园或是我们未来的工作的理解和展望 在外实习让我在不但学到了知识同时也感受到工作的繁忙,通过这次实习,我感到我距离成为一名卓越工程师已经不远了。 36
本文档为【软件工程实践校外实习报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_266065
暂无简介~
格式:doc
大小:157KB
软件:Word
页数:0
分类:生活休闲
上传时间:2018-01-20
浏览量:6