实 验 报 告
|
|
实验名称 基于Socket的C/S编程实验
课程名称 网络与分布计算
|
|
专业班级: 软件0702 学生姓名:
学 号: 成 绩:
指导教师: 翟学明 实验日期:2010-12-5
(实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm, 右2.1cm;字体:宋体小四号,1.25倍行距。)
验证性、综合性实验报告应含的主要内容:
一、实验目的及要求
二、所用仪器、设备
三、实验原理
四、实验方法与步骤
五、实验结果与数据处理
六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见)
七、所附实验输出的结果或数据
设计性实验报告应含的主要内容:
一、设计要求
二、选择的方案
三、所用仪器、设备
四、实验方法与步骤
五、实验结果与数据处理
六、结论(依据“设计要求”)
七、所附实验输出的结果或数据
* 封面左侧印痕处装订
一、实验目的及要求
目的:通过该实验,掌握使用Java语言实现基于Socket的C/S编程方法,着重体会使用Socket进行通信时,通信双方通信协议的制定方法。
要求: 1.进行实验预习工作;
2.准备实验必须的完整程序流程及源代码;
3.上机编程,调试程序,得到实验结果;
4.通过指导教师验收;
5.写出实验报告
二、所用仪器、设备
两台安装Windows XP的PC机,在一个局域网中,具有Java等编程环境Eclipse,JDK 1.60。
三、实验原理
编写一个基于C/S模式的数学服务器程序,并通过客户端进行访问。在这个分布式程序中,客户通过用户界面输入两个整型数组,并发送两个整型数组给数学服务器,数学服务器将两个数组相加,并将结果(作为一个数组)返回给客户。客户程序接收该结果数组,并将其输出到用户界面。程序应该包括如下内容:
1.简单的客户端输入/输出界面负责接收用户输入的数组,以及运算结果的输出。
2.读/写数组到流
Java API中没有现成的方法能够写整型数组到Socket,所以我们要写一个新类,其中的方法能够完成这项工作。同样,也没有现成的方法能够从Socket中读一个整型数组。所以在我们的新类中应有两个方法:一个从 Socket中读整型数组;另一个写整型数组到Socket中。
3.算术客户程序
它所做的就是打开一个Socket连接,一个输入流和一个输出流。客户程序发送两个整型数组到服务器,然后就等待服务器将结果数组发回。当客户程序接收到数组后,它输出数组到客户界面,之后,关闭I/O流和Socket。
4.算术服务器程序
运用有关线程编写知识,只需派生(或继承)Thread类的子类,并实现run()方法即可。run()方法实际上包括了服务程序所要进行的所有操作,但是线程只有在调用了start()方法后才会开始执行,并依次调用run()方法。
四、实验方法与步骤
Java socket 编程过程:
1.客户端程序都必须遵首下面的基本的步骤:
(1)建立客户端socket连接.
(2)得到socket的读和写的流.
(3)利用流.
(4)关闭流.
(5)关闭socket.
public void SendSock()
{
try{
TalkServer tServer=new TalkServer();
tServer.start();//启动服务器线程
//向本机的4700端口发出客户请求
Socket socket=new Socket("127.0.0.1",4700);
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
String readline1=txt1.getText();
String readline2=txt2.getText();
String readline=readline1+";"+readline2;
os.println(readline);
os.flush(); //刷新输出流,使Server马上收到该字符串
String getString=is.readLine();
txt3.setText(getString);
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
}
catch(Exception e1) {
System.out.println("Error"+e1); //出错,则打印出错信息
}
}
2.所有的服务器都要有以下的基本的步骤:
(1)建立一个服务器socket并开始监听.
(2)使用accept()方法取得新的连接.
(3)建立输入和输出流.
(4)在已有的协议上产生会话.
(5)关闭客户端流和socket.
(6)回到第二步或者到第七步.
(7)关闭服务器socket.
重复和并发服务器
public class TalkServer extends Thread {
public TalkServer() {
super();
}
public void run() {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//创建一个ServerSocket在端口4700监听客户请求
}
catch(Exception e) {
System.out.println("can not listen to:"+e);
//出错,打印出错信息
}
Socket socket=null;
try{
socket=server.accept();
}
catch(Exception e) {
System.out.println("Error."+e);
//出错,打印出错信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//在标准输出上打印从客户端读入的字符串
line=is.readLine();
AddTowArray addTowArray=new AddTowArray();
String result=addTowArray.StrToSubStr(line);
os.println(result);
//向客户端输出该字符串
os.flush();
//刷新输出流,使Client马上收到该字符串
System.out.println("Server:"+line);
System.out.println("Server:"+result);
os.close();
is.close();
socket.close();
server.close();
}
catch(Exception e) {
System.out.println("Error."+e);
//出错,打印出错信息
}
}
}
3. 读/写数组到流的处理方法
思路:从客户端得到两个符合自定义协议的数组字符串,通过自定义类AddTwoArray 对字符串进行解析,解析成两个数组后进行相应的操作,然后将结果转换成字符串,以便于服务器端的数据返回。
AddTwoArray的方法
public String StrToSubStr(String temp);//将字符串分割成子串
public void SubStrToArr(String sub1,String sub2);//将两个子串转换成数组
public String SumAll()//将两数组进行加法运算,并返回结果
五、实验结果与数据处理