《计算机技术综合》
课程设计
学生姓名: 何 妞
学 号: 6103105048
专业班级: 计算机051班
指导教师: 林振荣
二00八年 7 月 4 日
目 录
1.课程设计目的 …………………………………………………2
2.课程设计题目描述和要求 ……………………………………2
3.课程设计内容 …………………………………………………2
4.课程设计总结 …………………………………………………12
5.参考书目 ………………………………………………………12
1.课程设计目的
1.加深典型的Client/Server编程;
2.理解发送和接收数据的协议匹配;
3.学会使用线程机制来建立服务器;
4.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
2.课程设计题目描述和要求
实现文件传输功能
主要功能:
(1)有客户端和服务器端
(2)客户端可以上传各种类型的文件
(3)服务器端可以接受很多文件上传
(4)客户端发出请求后,在服务器端应答后能将文件传到服务器上
(5)实验实现时用环回测试将本机看作客户端和服务器端
3.课程设计报告内容
3.1课程设计源程序
程序1-->Client.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
public class Client extends JFrame implements ActionListener{
String str="";
private JTextField t1;
private JLabel l1,l2;
private JButton Exit,Ok,Open;
private JFileChooser choose=new JFileChooser();
private File Myfile;
public Client(){
Container c=getContentPane();
Panel p1=new Panel();
Panel p2=new Panel();
Panel p3=new Panel();
c.setLayout(new GridLayout(3,1));
p1.setLayout(new FlowLayout());
p2.setLayout(new FlowLayout());
p3.setLayout(new GridLayout(2,1));
t1=new JTextField(35);
l1=new JLabel("",JLabel.CENTER);
l2=new JLabel("",JLabel.CENTER);
Exit=new JButton("退出");
Ok=new JButton("上传");
Open=new JButton("浏览...");
Exit.addActionListener(this);
Ok.addActionListener(this);
Open.addActionListener(this);
p1.add(t1);
p1.add(Open);
c.add(p1);
p2.add(Ok);
p2.add(Exit);
c.add(p2);
p3.add(l1);
p3.add(l2);
c.add(p3);
setSize(500,200);
show();
}
public void actionPerformed(ActionEvent e){
str="";
if(e.getSource()==Exit){System.exit(0);}
try{
if(e.getSource()==Ok){
if(t1.getText()!=""){
this.client();
}
}
}catch(Exception t){
System.out.println(t.toString());
}
if(e.getSource()==Open){
this.openf();
}
}
public void openf(){
int result=choose.showOpenDialog(null);
Myfile=choose.getSelectedFile();
if(result==JFileChooser.APPROVE_OPTION){
t1.setText(Myfile.getPath());
}
else if(result==JFileChooser.CANCEL_OPTION){
t1.setText("");
Myfile=null;
}
}
public void client(){
byte[] ff;
int size;
Socket clientSocket;
PrintStream ps;
String fileName;
try{
//创建一个上传的Socket
clientSocket=new Socket("127.1.1.1",8765);
ps=new PrintStream(clientSocket.getOutputStream());
size=(int)Myfile.length();
fileName=Myfile.getName();
BufferedReader br=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String over="\n";
byte p[]=over.getBytes();
byte name[]=(fileName+over).getBytes();
System.out.println(new String(name));
//文件名
ps.write(name);
ps.flush();
String s1=br.readLine();
String tmp=String.valueOf(size)+over;
byte bsize[]=tmp.getBytes();
//文件大小
ps.write(bsize);
ps.flush();
String s2=br.readLine();
str="上传结束,请选择其它文件";
l1.setText(str);
str="已上传的文件为'"+s1.trim()+"';大小为"+s2.trim();
l2.setText(str);
//文件内容
FileInputStream in=new FileInputStream(Myfile);
BufferedInputStream bf=new BufferedInputStream(in);
ff=new byte[1024];
int c;
while((c=bf.read(ff))!=-1){
ps.write(ff,0,c);
}
ps.close();
bf.close();
in.close();
clientSocket.close();
t1.setText("");
}catch(Exception e){
System.out.println(e.toString());
}
}
public static void main(String args[]){
Client app=new Client();
app.addWindowListener(new WindowAdapter(){
public void WindowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
程序2-->Server.java
import java.net.*;
import java.io.*;
import java.util.*;
class MyThread extends Thread{
private Socket clientSocket;
private int counter;
public MyThread(Socket i,int c){
clientSocket=i;
counter=c;
}
//采用同步机制
public synchronized void run(){
try{
DataInputStream br=new DataInputStream(clientSocket.getInputStream());
DataOutputStream output=new DataOutputStream(clientSocket.getOutputStream());
//文件大小
byte[] n=new byte[225];
br.read(n);
output.write(n);
output.flush();
//文件名
byte[] ll=new byte[255];
br.read(ll);
output.write(ll);
output.flush();
String tmpe=new String(ll);
int a=Integer.parseInt(tmpe.trim());
//创建文件用于保存上传的文件
String names=new String(n);
File Myfile=new File("d:\\");
String files="d:\\"+Myfile.separator+(names.trim());
FileOutputStream out=new FileOutputStream(files);
BufferedOutputStream bw=new BufferedOutputStream(out);
byte ff[]=new byte[1024];
int c=0;
//把上传的数据输出至文件
while((c=br.read(ff))!=-1){
bw.write(ff,0,c);
}
bw.close();
output.close();
out.close();
br.close();
clientSocket.close();
}catch(Exception e){
System.out.println(e);
}
}
}
public class Server{
private static Socket clientSocket;
private static int counter;
public static void main(String[] args){
int i=1;
ServerSocket serverSocket;
try{
serverSocket=new ServerSocket(8765);
while(true){
System.out.println("等待客户端上传文件..");
//监听与本socket的连接并且接受它
clientSocket=serverSocket.accept();
//创建线程,将上传数据写至服务器的文件中
Thread t=new MyThread(clientSocket,i);
t.start();
System.out.println("上传成功!");
i++;
}
}catch(Exception e){
System.out.println(e);
}
}
}
3.2实验结果
① 测试程序结果时,要先运行服务器端程序Server.Java,让服务器端准备好接受客户端请求,然后才能运行客户端程序,如图1。
图 1 等待接受上传文件
② 运行客户端程序Client.Java,效果如图2。
图 2
③ 点击“浏览”,弹出文件对话框,如图3所示。
图 3
④ 找到某个目录下的某个文件,然后打开。我选择了D:\[国产][井冈山][国语][TVRIP-RMVB][TF]\[TF]井冈山01.Rmvb,打开后效果如图4。
图 4
⑤ 点击“上传”后,等待一段时间后Client.Java程序运行效果如图5。
图 5
⑥ 服务器端程序运行效果如图6。
图 6
⑦ 用于保存上传的文件的目录里面多了个上传的文件,如图7。
图 7
⑧ 再上传一个文件,如图8。
图 8
⑨ 点击“上传”后运行效果如图9。
图 9
⑩ 服务器端运行效果如图10。
图 10
11 用于保存上传的文件的目录里面又多了个刚上传的文件,如图11。
图 11
4.结论
在做课程设计以前,我对文件传输的理解只是停留在理论知识的水平上,是“纸上谈兵”,缺乏实际的程序设计经验。这次通过做课程设计,我基本完成了老师下达的设计任务。
这是我这个课程设计的第二次设计,之前第一次的设计报告发给老师后完全不符合老师的要求,因为上学期课程设计的老师和林老师不一样,而我是完全按照上学期的思维来写设计报告的。
在这次的设计过程中我几乎完全改了第一次的程序,在看了老师的模板后,我才知道自己的第一次的设计报告有多乱多繁琐,而且没有图形界面,没有良好的交互性。现对这次的设计几点体会总结如下:
其一,本程序我选择用java进行开发。由于之前学过java语言,所以有一定的基础,但是因为过了比较长的时间,关于java的很多知识都忘记了,很多java 组件都不知道怎么用,后来经过努力复习才记起了那些基本知识。
其二, 在接到任务后我发现自己完全不懂网络编程的知识,而这个课程设计又要用到网络编程的知识,但是经过自己到图书馆查阅很多资料,最终掌握了网络编程的技巧,并完成了这次的编程。
其三,通过这次编程,我学会了运用java语言进行网络编程,提高了自身的网络编程能力。
总之,经过这几天的努力,我最终完成了“基于java的文件传输功能实现”的设计。在整个设计过程中,我不仅巩固了java知识和网络知识, 而且也达到了锻炼自己的目的,同时进一步加深了对编程的认识和理解。此次课程设计给我提供了一个既动手又动脑、自学、独立实践的机会,使我们养成了勤翻阅各种相关资料的习惯,将书本上的理论知识和实际有机地结合起来,锻炼了实际分析问题和解决问题的能力,提高了适应实际、实践编程的能力,为今后的学习和实践打下了良好的基础。
参考书目:
[1] 陈轶,姚晓昆 《Java程序设计实验指导》 机械工业出版社 2006
[2] 邱桃熔,林振荣,冯缨 《Java语言程序设计教程》 机械工业出版社 2005
[3] 谢希仁 计算机网络 大连理工大学出版社 2005
JAVA2程序设计 课 程 设 计 说 明 书
题目: 购物车实现
系别: 计 算 机 工 程 系 班别: 计 0 7 1 班 姓名: 朱 其 贵 学号: 200700401032 指导老师: 罗 衡 郴 完成时间: 2010-2-27
广西工学院计算机工程系
实现环境
该课程设计是在MyEclipse 8.0上设计并运行,采用的是JSP语言;mySQL数据库软件连接数据库实现对用户、图书、用户订单、订单图书等数据的存放和传送。
一. 数据库设计
1.表的设计
在这个数据库管理系统中要建立4张数据表: 用户注册表(my_user):用于存放注册用户的信息 图书信息表(my_book):用户存放图书记录
用户-订单表(my_indent):用户存放用户下达的订单基本信息 订单_图书表(my_indentlist):用于存放订单的图书信息. 这4张数据表的字段说明如表2-1~~2-4所示。
表1-1注册用户表(my_user)
表1-2图书信息表(My_book)
表1 -- 4订单-商品表(my_indentlist)
2. 数据库连接
本系统采用数据库连接池进行数据库的统一管理,同时在数据库操作上进行了封装,方便程序开发时与数据库的交互。
2.1数据库连接池
在实现某一个功能时,首先要连接数据库。如果在每一次需要进行数据库操作前都要来加载驱动,创建连接。也可以采用如下代码的一个类统一管理数据库的连接。 public class DBConnectionManager {
private String driverName = "org.gjt.mm.mysql.Driver";
private
String
url="jdbc:mysql://localhost:3306/mycart?useUnicode=true&characterEncoding=GBK"; private String user = "root"; private String password = "root"; public Connection getConnection() {
Class.forName(driverName);
return DriverManager.getConnection(url, user, password); }
}
在此类中,有4个参数。即数据库的驱动、连接地址、用户名和密码。 2.2数据库封装
数据库已经进行连接,那么根据我们所学的知识可以知道,在每一次需要进行数据库的某种操作时,只须调用对应的JDBC的函数就可以了。但是为了提高编写代码的效率,可以封装如下的数据库操作类。 public class DataBase {
protected Connection conn = null; protected Statement stmt = null; protected ResultSet rs = null;
protected PreparedStatement prepstmt = null; boolean isConnect=true; public DataBase() {
sqlStr = "";
DBConnectionManager dcm = new DBConnectionManager(); conn = dcm.getConnection(); stmt = conn.createStatement();
}
public void close(){
//Connection接口 //Statement接口 //记录结果集
//PreparedStatement接口 //与数据库连接标识
if ( stmt != null ){
stmt.close();
stmt = null;
}
conn.close();
conn = null;
}
};
二.系统的总体流程
三.界面设计与代码实现
3.1 用户注册模块设计与实现
购物车系统是用来买卖图书的,那么购物者就是一般用户。根据设计可知一般用户要求使用该系统来下订单,需要进行注册,来记录自己的个人信息到系统里,以便进行工作。
用户注册界面对应的数据表是用户表My_user,根据这个表的字段信息,可知注册界面中需要填入的用户信息包括登录用户名、密码和确认密码(以便保证用户两次输入的密码都一样)、联系地址、联系邮编、联系电话和电子邮件。
用户注册的页面是reg.jsp,在该界面中可知,注册用户时需在填写用户的基本信息,如
用户名,密码等,在用户单击“提交”按钮保存填入的数据时,页面需要将这些页面的表单取出来。在本页面的处理时,将jsp页面的提交对象request作为对象,传进userop.java类中。在执行添加新用户之前,需要检验新输入的用户名是否在系统中存在,一旦存在则不允许添加,因为用户名标志一个用户的惟一信息,然后在根据表My_user组合INSERT语句。 public boolean insert(HttpServletRequest req) throws Exception {
if (getRequest(req)) { sqlStr = "select * from My_user where username = '" + user.getUserName()
rs = stmt.executeQuery(sqlStr); if (rs.next()) { message = message + "该用户名已经存在!"; rs.close(); return false; = "insert into my_user +"'"; } sqlStr
(username,password,Address,Phone,Post,Email) values ('";
sqlStr = sqlStr + strFormat.toSql(user.getUserName()) + "','"; sqlStr = sqlStr + strFormat.toSql(user.getPassWord()) + "','";
sqlStr = sqlStr + strFormat.toSql(user.getAddress()) + "','"; sqlStr = sqlStr + strFormat.toSql(user.getPhone()) + "','"; sqlStr = sqlStr + strFormat.toSql(user.getPost()) + "','"; sqlStr = sqlStr + strFormat.toSql(user.getEmail()) + "')"; try { stmt.execute(sqlStr); sqlStr = "select max(id) from My_user where username = '" +user.getUserName()+ "'";
rs = stmt.executeQuery(sqlStr);
while (rs.next())
} } { { userid = rs.getLong(1); } rs.close(); return true; catch (SQLException sqle) return false; } } else { } return false;
3.2 用户在线购物模块设计与实现
用户登录后,主要的工作就是在线购书了。在线购书时,首先需要查看货架上有哪些图书。图书内容包括图书的基本信息有书名、出版社、作者、定价。此界面只是展示数据表My_book中的基本数据,因此在此不再介绍界面的设计,每一种图书还需要提供“购买”按钮,以便用户能够方便的购买。
单击 “购买”按钮,就可以供用户进行购买操作。与实际的购物过程相似,在购买操作中,需要填写的是购买该图书的数量。因此在该界面中设计了填写购书数量的文本框架和“提交”购书的按钮。到此,用户购物的操作界面设计完成了,接下来的就是如何来处理这些购物——购物车的功能了。
在线购书,主要功能就是添加图书到自己的购物车。单击“购买”按钮跳转到purchase.jsp页面,在该页面中允许用户输入购买的数量,单击“购买”时候提交到数据库。要提交时将选择图书的ID和图书的数量通过request传递到purchase.java中。
此部分工作的流程如下:
(1) 判断用户输入的购买数量是否合法,如不合法,则不执行。
(2) 查看该用户在这次购书中(即购物车)是否已经购买了该图书,如果是第一次购买,
则往购物车中添加该数量的该图书,否则将购物车中该图书的数量累加。
(3) 将重新计算的购物车的图书列表添加到用户的session中。
3.3 用户购物车管理模块设计与实现
当用户完成购书后,需要提交购物结算。首先,就是要查看自己的购物车里自己已选购了哪些图书,以及图书的数量。
购物车操作界面中要实现如下5个方面功能。
显示选购图书的列表:包括选购的图书的名称、出版社、作者、定价、总数量和总价格。 修改选购的某一种图书数量:需要提供修改数量的文本框。
删除选购的某一种图书。
清空购物车:取消此次购书。
提交购物车:提交购物车下订单给管理员并选择结账方式。
另外,为了方便使用,还需要提供“继续购物”的操作链接。购物对应的数据表为用户-订单表(My_Indent)和订单-图书表(My_IndentlList)。
用户购书完成后,应该进入管理购物车流程。在该界面中,可以进行的工作包括查看购物图书,修改购物车图书的数量,从购物车删除图书,清空购物车,提交购物车。
查看购物车图书页面是cartlist.jsp ,即是从session缓存中取出用户刚才购买的图书列表。由于这些信息存储在session中,因此这里只须从session中直接提取,保存在Vector类型的变量shoplist中.
修改购物车图书数量的页面也是cartlist.jsp,单击“修改”按钮调用类purchase.java中修改函数mokiShoper()即可。此步中,只须从session取出商品的记录shoplist,用用户填入的数量来替换原有的数量,然后再将shoplist 保存在session中即可。
从购物车删除图书的页面也是cartlist.jsp,单击“删除”按钮调用类purchase.java中的删除函数delShoper()即可。此步中,与修改操作相似,即是从session中取出商品记录shoplist,将变量中刚才用户选择的图书的id对应的图书删除,再将shoplist保存在session中。清空购物车的页面也是cartlist.jsp,单击“清空购物车”按钮直接从session中清空该用户的记录即可。提交购物车的页面也是cartlist.jsp,单击“提交购物车”按钮调用类purchase.java中的提交函数payout()函数即可。此步中,要进行如下的流程。
(1) 从session中取出购物车中的图书列表,保存在purchaselist中。
(2) 如果purchaselist为空,则表示购物车为空不执行,否则继续。
(3) 取得用户的id,购物总价格等参数,提交到订单数据表My_indent中,生成一个新
的订单。
(4) 将购物车中的所有图书,添加到订单-图书数据表达式My_indentlist中。
3.4 用户订单查看模块设计与实现
用户提交完购物车后,系统就自动生成了订单。订单提交给系统管理员进行管理,用户也需要随时查看自己下达的订单的信息。为此,需要设计订单查看界面,此界面要体现的信息包括订单的编号(用户每提交一次购物车就会生成一个订单),总金额(一次购书总金额)。订单对应的数据表为My_Indent。
用户查看订单的页面是indent.jsp。该功能要求提取当前用户的所有订单列表,调用类purchase.java的函数getIndent。该类根据用户的id查找订单表My_indent组合SELECT语句进行查找,结果保存在Vector类型变量my_indent中,代码如下:
public boolean getIndentList(String nid) {
sqlStr = "select * from my_indentlist where IndentNo = '" + nid + "'"; try { rs = stmt.executeQuery(sqlStr); indent_list = new Vector(); while (rs.next()) { indentlist identlist = new indentlist(); identlist.setId(rs.getLong("Id")); } identlist.setIndentNo(rs.getString("IndentNo")); identlist.setBookNo(rs.getLong("Bookid")); identlist.setAmount(rs.getInt("Amount")); indent_list.addElement(identlist); rs.close(); return true; } catch (SQLException e) { } } return false;
四.结论
本系统在功能上相对完整,设计了购物车的常用功能块。系统的关键部分主要集中在用户查看新书,用户添加购物车,查看订单上。由于我们对html方面的知识不是很了解,本系统的界面设计并不是很美观。
因为学的《java课程设计》这门课程只是粗略的学习,没能熟练地运用。本次的设计只是很简单的一个购物车。虽然不是什么大系统,但是通过这次的课程设计,让我对Java程序设计语言有了进一步的了解。为日后的学习提供了良好的的基础。由于是刚刚开始学习,在做这个课程设计时自己也遇到了一些的问题。不过在同学的帮助下得到了解决,这些经验可以让我在日后的学习中,让我少走弯路。也锻炼了自己的动手能力。
参考文献:
[ 1 ] 陈帆,和红杰,周荣辉. Java 2程序设计实用教程. 机械工业出版社,2005
[ 2 ] 施伯乐,丁宝康,汪卫. 数据库系统教程(第2版). 高等教育出版社,2003
[ 3 ] 王国辉,李文立,杨亮. JSP数据库系统开发完全手册. 人民邮电出版社,2006
[ 4 ] 刘中兵,李伯华,邹晨. JSP数据库项目案例导航. 清华大学出版社,2006
姓名学院电气与电子工程学院班级学号邮箱时间本科生课程研究报告指导手册0高电压工程课程报告目录本科生课程研究报告指导手册1本科生课程…
大连交通大学逆向工程课程论文课程报告题目基于逆向工程的个性化假体设计综述学生姓名学号所在院系机械工程学院指导教师1大连交通大学逆向…
华北科技学院课程总结20xx20xx学年第1学期安全评价技术院部安全工程学院姓名班级B105学号20xx10044502指导教师张…
计算机技术综合课程设计学生姓名何妞学号6103105048专业班级计算机051班指导教师林振荣二00八年7月4日目录1课程设计目的…
20xx年初中教师新课标课例研究全员远程研修观课报告(范文)在今天的观课议课活动中,我选择以“??”作为自己的观察视角,实地观察了…
姓学院专业班级指导教师提交时间封面格式说明:1、报告封面中注明:报告题目、指导教师、作者姓名、学院、专业;2、页边距:上3.6cm…
近几年,我国许多高等院校纷纷开设电子商务课程,学生反映强烈。北方交通大学是我国率先开展电子商务教学的高校之一,19xx年就开设了《…
课程学习报告课程名称监控组态软件班级学号姓名一学习目的1了解组态软件的使用环境及其基本功能2掌握组态软件的使用方法3掌握监控组态软…
华北科技学院课程总结20xx20xx学年第1学期安全评价技术院部安全工程学院姓名班级B105学号20xx10044502指导教师张…