当前位置:文档之家› 搜索引擎技术基础-多线程编程实验报告

搜索引擎技术基础-多线程编程实验报告

昆明理工大学信息工程与自动化学院学生实验报告(2011 —2012 学年第 1 学期)课程名称:搜索引擎技术基础开课实验室:信自楼445 2011年 11月 9日一、实验目的1、掌握Socket通信原理。

2、掌握并实现多线程编程技术二、实验原理及基本技术路线图(方框原理图)无三、上机平台、环境PC机,MyEclipse 7.5版本四、实验方法、步骤1、通过Socket通信实现客户端与服务器端的通信。

2、实现服务器端对客户端的多线程技术。

五、实验过程原始记录(数据、图表、计算等)1、通过Socket通信实现客户端与服务器端的通信。

Socket通信分为ServerSocket和Socket两部分,ServerSocket类提供TCP连接服务,Socket类提供进行通信的Socket对象。

建立TCP连接的各个步骤:分别是:●服务器创建一个ServerSocket对象,指定端口号,ServerSocket对象等待客户端的连接请求。

●客户端创建一个Socket对象,指定主机地址和端口号,向服务端发出连接请求。

●服务端接收到客户端的连接请求,建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信。

●当一方决定结束通信,向对方发送结束信息;另一方接收到结束信息后,双方分别关闭各自的TCP连接。

●ServerSocket对象停止等待客户端的连接请求。

作为服务器首先构造一个提供TCP连接服务的ServerSocket对象,然后指定其端口号,如果接收到客户端的连接请求,则建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信,然后将从文件中读入的数据传送给客户端。

由于服务器需要一直等待连接,所以需要监听端口请求。

源程序:(1)服务器端 EchoServer.javapackage test1;import .* ;public class EchoServer implements Runnable{public static void main(String args[]) throws Exception {// 所有异常抛出ServerSocket server = null ; // 定义ServerSocket类Socket client = null ; // 表示客户端server = new ServerSocket(8888) ; // 服务器在8888端口上监听boolean f = true ; // 定义个标记位while(f){System.out.println("服务器已经运行,等待客户端连接。

") ;client = server.accept() ; // 得到连接,程序进入到阻塞状态EchoThread thread=new EchoThread(client);Thread echothread=new Thread(thread,"thread");echothread.start();}client.close() ;}@Overridepublic void run() {}}(2)客户端 EchoClient.javaimport .* ;import java.io.* ;public class EchoClient{public static void main(String args[]) throws Exception {// 所有异常抛出Socket client = null ; // 表示客户端client = new Socket("localhost",8888) ;BufferedReader buf = null ; // 一次性接收完成PrintStream out = null ; // 发送数据BufferedReader input = null ; // 接收键盘数据input = new BufferedReader(newInputStreamReader(System.in)) ;buf = new BufferedReader(newInputStreamReader(client.getInputStream())) ;out = new PrintStream(client.getOutputStream()) ;boolean flag = true ; // 定义标志位while(flag){System.out.print("欢迎登陆:") ;String str = input.readLine() ; // 接收键盘的输入信息out.println(str) ;}buf.close() ;client.close() ;}}截图:(1)开启服务器端等待客户端的连接:(2)客户端通过8888端口与服务器端建立连接:(3)客户端输入欲打开的文件名服务器端的响应:(4)客户端接收到从服务器端发送来的文件内容:2、实现服务器端对客户端的多线程技术。

线程:程序中单个顺序的流控制,是最小的执行单位;同类的多个线程共享一块内存空间和一组系统资源;线程独享的资源只有:寄存器,系统堆栈。

多线程:程序中多个片断同时执行。

多线程实现方法:创建一个实现Runnable 接口的类,该接口中只有一个方法:public void run();已实现的run方法称为线程体,而实现了Runnable接口的对象称为线程的目标对象。

将实现了Runnable接口的类的实例作为Thread类构造函数的参数创建线程对象,调用该对象的start()方法启动线程源程序:(1)线程类 EchoThread.javapackage test1;import .* ;import java.io.* ;public class EchoThread implements Runnable{private Socket client = null;private static String disk="F:\\FFile\\";public EchoThread(Socket client){this.client = client ;}public static String readFile(String fname) throws Exception{ String filename=disk+fname;String contentString="";StringBuffer sb=new StringBuffer();FileInputStream fin=new FileInputStream(filename);BufferedReader br=new BufferedReader(newInputStreamReader(fin));System.out.print("打开文件名:"+filename+":");while((contentString=br.readLine())!=null){sb.append(contentString);}br.close();fin.close();contentString=new String(sb);return contentString;}public void run(){BufferedReader buf = null ; // 接收输入流PrintStream out = null ; // 打印流输出最方便try{out = new PrintStream(client.getOutputStream()) ;// 准备接收客户端的输入信息buf = new BufferedReader(newInputStreamReader(client.getInputStream())) ;boolean flag = true ; // 标志位,表示可以一直接收并回应信息while(flag){String str = buf.readLine() ; // 接收客户端发送的内容System.out.println("\n**********");if(str==null||"".equals(str)){ // 表示没有内容flag = false ; // 退出循环}else{if("bye".equals(str)){// 如果输入的内容为bye表示结束flag = false ;}else{String content=readFile(str);out.println(content) ; // 回应信息}}}client.close() ;}catch(Exception e){}}}截图:(1)打开一个客户端与服务端建立连接:(2)再打开一个客户端,服务器端通过多线程来实现:六、实验结果分析、经验总结或结论(例如对实验获取数据的误差分析、数据处理、成果等。

其中,绘制曲线图时必须用标准计算纸,不得随意用普通白纸绘画)多线程是提高效率的一个非常重要的途径,比如计算机并行计算等,本次实验通过亲手实践了网络Socket通信,同时也完成了多线程的任务,对网络间通信以及搜索引擎如何实现向海量用户在很短时间内提供服务有了更深刻的认识。

相关主题