基于CS的算术计算程序.docx
《基于CS的算术计算程序.docx》由会员分享,可在线阅读,更多相关《基于CS的算术计算程序.docx(16页珍藏版)》请在冰豆网上搜索。
基于CS的算术计算程序
课程设计Ⅲ课程设计
设计说明书
基于C/S的算术计算程序
学生姓名
学号
班级
成绩
指导教师
贾伟
计算机科学与技术系
2010年01月14日
课程设计Ⅲ课程设计评阅书
题目
基于C/S的算术计算程序
学生姓名
学号
指导教师评语及成绩
成绩:
教师签名:
年月日
答辩教师评语及成绩
成绩:
教师签名:
年月日
教研室意见
总成绩:
室主任签名:
年月日
注:
指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。
课程设计任务书
2010—2011学年第一学期
专业:
计算机科学与技术学号:
姓名:
课程设计名称:
网络工程课程设计
设计题目:
基于C/S的算术计算程序
完成期限:
自2011年01月04日至2011年01月14日共2周
设计依据、要求及主要内容(可另加附页):
课题背景:
C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。
它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,提高系统的应用环境。
设计任务:
用户通过向客服程序输入简单的算术计算命令,(如“add35”)客户程序发送给服务程序,服务程序得到命令计算出结果返回给客户程序,客户程序将返回的计算结果显示出来。
设计要求:
算术计算实现简单的一个计算符号,两个计算数的运行即可,不需要计算复杂的复杂计算表达式。
指导教师(签字):
教研室主任(签字):
批准日期:
年月日
摘要
C/S(Client/Server)客户/服务器模式,客户/服务器在分布处理过程中,使用基于连接的网络通信模式。
基于C/S的算术计算程序设计使用Java语言编写,该程序在服务器上时,负责监听客户请求,为每个客户请求建立Socket连接,从而为客户提供响应服务。
本程序提供的服务为:
读取来自客户的简单算式,计算该算式,并把结果发回给客户机。
关键词:
C/S;Socket;JAVA
目录
1课题描述1
2设计过程2
3主要算法和流程图6
3.1服务器源代码6
3.2客户端源代码7
4运行结果10
5总结13
参考文献14
1课题描述
基于C\S的算术计算程序是用户通过向客户程序输入简单的算术计算命令,(如“add35”)客户程序发送给服务程序,服务程序得到命令计算出结果返回给客户程序,客户程序将返回的计算结果显示出来。
Client/Server结构(C/S结构)是大家熟知的客户机和服务器结构。
它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
目前大多数应用软件系统都是Client/Server形式的两层结构。
基于C\S的算术计算程序是用JAVA语言编写,服务器使用ServerSocket类来处理客户机的连接请求,客户机首先创建一Socket对象,用以与服务器通信。
2设计过程
本次设计是基于C\S的算术计算程序,客户机/服务器在分布处理过程中,使用基于连接的网络通信模式。
该通信模式首先在客户机和服务器之间定义一套通信协议,并创建一Socket类,利用这个类建立一条可靠的链接;然后,客户机/服务器再在这条链接上可靠地传输数据。
客户机发出请求,服务器监听来自客户机的请求,并为客户机提供响应服务。
这就是典型的"请求--应答"模式。
使用Java语言编写一个分别针对服务器和客户机的应用程序(Application)。
所谓Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
Socket和ServerSocket类库位于java.net包中。
ServerSocket用于服务器端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
服务器,使用ServerSocket监听指定的端口,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端与服务器端交互原理图如下所示:
图2.1客户端与服务器交互原理图
服务器类图如下所示:
图2.2服务器类图
客户机类图如下所示:
图2.3客户机类图
MySocketServer.java文件中run()函数流程图如下所示:
图2.4run()函数流程图
MyClient.java文件中actionPerformed()函数流程图如下所示:
图2.5actionPerformed()函数流程图
3主要算法和流程图
3.1服务器源代码
MySocketServer.java文件:
当Client有请求时,Server创建一个Frame用于与之交互资料
classServiceThreadextendsFrameimplementsRunnable
{ServerServiceFatherListener;//创建当前通信线程的监听器物件
SocketConnectedClient;//负责当前线程中C/S通信的Socket物件
ThreadConnectThread;//负责通信的线程
PanelListenerPanel;//本次通信Server端的信息显示窗口
TextAreaServerMeg;//信息显示窗口的文本区域
publicServiceThread(ServerServicesv,Sockets)//构造函数
{
FatherListener=sv;
ConnectedClient=s;
ConnectThread=newThread(this);
setTitle("AnswerClient");//建立并显示Server端信息显示窗口
setLayout(newBorderLayout());
ServerMeg=newTextArea(10,50);
add("Center",ServerMeg);
setResizable(false);//不可改变窗口大小
pack();
InetAddressClientAddress=ConnectedClient.getInetAddress();//获得请求服务的Client端计算机的IP地址
ServerMeg.append("Clientconnected"+"from\n"+ClientAddress.toString()+".\n");
}
子线程任务:
与Client端通信,构造run()函数,其中包括获得从Client读入数据流
InputStreamReaderin=newInputStreamReader(ConnectedClient.getInputStream());
获得向Client输入的数据流
PrintStreamout=newPrintStream(
newBufferedOutputStream(ConnectedClient.getOutputStream()));
缓冲out.flush();
进行加法运算if(operate.equals("加法")){
h=x+y;
while(true){
out.println("x="+x+"y="+y+","+"x+y="+h);
out.flush();
}
}
进行减法运算if(operate.equals("减法")){
h=x-y;
while(true){
out.println("x="+x+"y="+y+","+"x-y="+h);
out.flush();
}
}
进行乘法运算if(operate.equals("乘法")){
h=x*y;
while(true){
out.println("x="+x+"y="+y+","+"x*y="+h);
out.flush();
}
}
进行除法运算if(operate.equals("除法")){
h=x/y;
while(true){
out.println("x="+x+"y="+y+","+"x/y="+h);
out.flush();
}
}
异常处理catch(Exceptione){}
FatherListener.addMeg("Client"+"close."+"\n");
dispose();关闭Client窗口
3.2客户端源代码
MyClient.java文件:
使用Socket对网络上某一个服务器的某一个端口发出连接请求
SocketClientSocket;
PrintStreamos;
InputStreamReaderis;
BufferedReaderbr;
consist()函数中将按钮加入到按钮组中
rb1=newJRadioButton("加法");
rb1.setSelected(true);//默认是加法
rb2=newJRadioButton("减法");
rb3=newJRadioButton("乘法");
rb4=newJRadioButton("除法");
bg=newButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
bg.add(rb4);
setTitle("ClientWindow");
GridBagLayoutgbl=newGridBagLayout();
GridBagConstraintsgbc=newGridBagConstraints();
setLayout(gbl);
this.addWindowListener(newWinAdptClient(this));
设置布局,如坐标(1,1)的位置
gbc.gridx=1;gbc.gridy=1;
gbc.gridwidth=1;
gbc.gridheight=1;
gbc.fill=GridBagConstraints.HORIZONTAL;
gbc.weightx=1;gbc.weighty=0;
gbc.insets=newInsets(2,5,1,5);
gbl.setConstraints(rb1,gbc);
add(rb1);
进行连接
publicvoidconnect()
{
try{
ClientSocket=newSocket(InetAddress.getLocalHost(),8000);
os=newPrintStream(
newBufferedOutputStream(ClientSocket.getOutputStream()));
is=newInputStreamReader(ClientSocket.getInputStream());
br=newBufferedReader(is);
s=br.readLine();
textArea.append(s+"\n");
}
catch(Exceptione){}
}
函数actionPerformed中
如果选择发送按钮if(e.getSource()==MyButton)
os.println(enterx.getText());//发送x
os.println(entery.getText());//发送y
如果选择rb1,发送加法if(rb1.isSelected()){
os.println("加法");
}else
如果选择rb2,发送减法if(rb2.isSelected()){
os.println("减法");
}else
如果选择rb3,发送乘法if(rb3.isSelected()){
os.println("乘法");
}else
如果选择rb4,发送除法if(rb4.isSelected()){
os.println("除法");
}
使用Socket获得从Server读入数据流
is=newInputStreamReader(ClientSocket.getInputStream());
br=newBufferedReader(is);
s=br.readLine();
textArea.append(s+"\n");
如果选择连接按钮if(e.getActionCommand()=="连接"),调用函数connect();
如果选择断开按钮if(e.getActionCommand()=="断开"),
is.close();
os.close();
ClientSocket.close();
关闭ClientSocket.
4运行结果
运行程序源代码,得到如下结果:
图4.1启动服务器
图4.2启动客户端
图4.3连接后进行加法运算
图4.4连接后进行减法运算
图4.5连接后进行乘法运算
图4.6连接后进行除法运算
5总结
课程设计的过程是非常不容易的,但对我却有很大的启发。
这次课程设计我主要是应用JAVA语言以及网络编程,综合起来才完成基于C\S的算式计算程序,比平常上机实验所编程序要复杂,锻炼了我自己。
首先,网络工程程序设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识;再次,我在课程设计中碰到了很多的问题,通过查阅相关资料以及上网查询进行解决,同时贾伟老师对我也进行了指导,指出了课程设计流程中的错误,提出了建议。
越来越多的人们开始依靠计算机来解决自己遇到的问题,C/S结构软件(即客户机/服务器模式)分为客户机和服务器两层,客户机不是毫无运算能力的输入、输出设备,而是具有了一定的数据处理和数据存储能力,通过把应用软件的计算和数据合理地分配在客户机和服务器两端,可以有效地降低网络通信量和服务器运算量。
由于服务器连接个数和数据通信量的限制,这种结构的软件适于在用户数目不多的局域网内使用。
国内目前的大部分ERP(财务)软件产品即属于此类结构。
我所设计的基于C\S的算术计算程序是客户机/服务器的一个。
当然,通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,不断进取,能使自己在网络编程这方面有一个大的发展。
参考文献
[1]方敏,张彤.网络应用程序设计.西安:
电子科技大学出版社,2005
[2]张白一,崔尚森.面向对象程序设计-Java(第二版)[M].西安:
电子科技大学出版社,2006
[3]谢希仁.计算机网络(第五版)[M].北京:
电子工业出版社,2008