《bs网络模式的运行原理及实现》由会员分享,可在线阅读,更多相关《bs网络模式的运行原理及实现(30页珍藏版)》请在金锄头文库上搜索。
1、BS模式的工作原理及实现 作者:李世明BS模式lBS模式,即浏览器服务器模式,是一种 从传统的二层CS模式发展起来的新的网络 结构模式,其本质是三层结构CS模式。 BS模式的工作原理 l在BS模式中,客户端运行浏览器软件。 浏览器以超文本形式向Web服务器提出访 问数据库的要求,Web服务器接受客户端 请求后,将这个请求转化为SQL语法,并 交给数据库服务器,数据库服务器得到请 求后,验证其合法性,并进行数据处理, 然后将处理后的结果返回给Web服务器, Web服务器再一次将得到的所有结果进行 转化,变成HTML文档形式,转发给客户端 浏览器以友好的Web页面形式显示出来。 BS模式的工作原理
2、l BS模式的工作原理使用到的技术lSocket网络通信 l多线程 lIO流(文件操作)TCP协议l TCP协议提供可靠的连接服务,采用三次握手建立一个连 接。 l 第一次握手:建立连接时,客户端发送syn包(syn=j)到服 务器,并进入SYN_SEND状态,等待服务器确认; l 第二次握手:服务器收到syn包,必须确认客户的SYN( ack=j+1),同时自己也发送一个SYN包(syn=k),即 SYN+ACK包,此时服务器进入SYN_RECV状态;l 第三次握手:客户端收到服务器的SYNACK包,向服务 器发送确认包ACK(ack=k+1),此包发送完毕,客户端和 服务器进入ESTABL
3、ISHED状态,完成三次握手。 图l Scoket服务器l ServerSocket server = new ServerSocket(4700); l / 创建一个ServerSocket在端口4700监听客户请求l System.out.println(“等待用户连接,处于阻塞状态。“);l Socket socket = server.accept(); l / 使用accept()阻塞等待客户请求,有客户 l / 请求到来则产生一个Socket对象,并继续执行 l System.out.println(“连接的IP: “+socket.getInetAddress().getHost
4、Address();服务器Scoket客户端lString ip = “localhost“; lSocket socket = new Socket( ip , 4700);IO流的使用l 获得输入流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(); l 获得输出流 PrintWriter out = new PrintWriter(socket.getOutputStream();l out.close(); / 关闭Socket输出流 l in.close(); /
5、关闭Socket输入流 l socket.close(); / 关闭SocketIO流的使用l发送 out.println(“bye“); out.flush();l接收 in.readLine() /注意此方法会处于阻塞状态,不接到数据 就停在这等。案例-信息发送l服务器 l功能:n接收客户端发来的“数据”,打印到控制台。l客户端n做一个死循环,发送“数据”多线程l一、操作系统中线程和进程的概念 l二、Java中的线程 一、操作系统中线程和进程的概念 l 现在的操作系统是多任务操作系统。多线程是实现多任务 的一种方式。l 进程是指一个内存中运行的应用程序,每个进程都有自己 独立的一块内存空间
6、,一个进程中可以启动多个线程。比 如在Windows系统中,一个运行的exe就是一个进程。l 线程是指进程中的一个执行流程,一个进程中可以运行多 个线程。比如java.exe进程中可以运行很多线程。线程总 是属于某个进程,进程中的多个线程共享进程的内存。l “同时”执行是人的感觉,在线程之间实际上轮换执行。Java中的线程l在Java中,“线程”指两件不同的事情: l1、java.lang.Thread类的一个实例; l2、线程的执行。继承java.lang.Thread类public class Person extends Thread/线程体 public void run() /在这里
7、添加代码 System.out.println(“线程开始。“); 运行线程类:Person person = new Person(); person.start();案例-多线程public class Person extends Thread private String name ;public Person(String name)this.name = name;public void run() int i = 0;while( i = 100 )System.out.println(name+“线程-“+i+);try this.sleep(100); /休眠100毫秒 ca
8、tch (InterruptedException e) e.printStackTrace(); /= Person person1 = new Person(“孙悟空“); person1.start(); Person person2 = new Person(“猪八戒“); person2.start();实现java.lang.Runnable接口public class User implements Runnablepublic void run() /在这里添加代码System.out.println(“线程开始。“); 运行线程类:User user = new User()
9、; new Thread( user ).start();案例-多线程public class User implements Runnableprivate String name ;public User (String name)this.name = name;public void run() int i = 0;while( i = 100 )System.out.println(name+“线程-“+i+);try Thread.sleep(100); /休眠100毫秒 catch (InterruptedException e) e.printStackTrace(); /=
10、User user1 = new User(“孙悟空“); new Thread( user1 ).start(); User user2 = new User(“猪八戒“); new Thread( user2 ).start();案例-聊天室l到这里大家已经可以简单使用Scoket和多 线程了。l我们来做一个案例。 l把刚才的信息发送改成聊天室。IO流l 什么是流? 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX 中,管道是一条不间断的字节流,用来实现程序或进程间 的通信,或读写外围设备、外部文件等。流的方向是重要的,根据流的方向。 l 流可分为两类:输入流和输出
11、流。 用户可以从输入流中读取信息,但不能写它。相反,对输 出流,只能往输入流写,而不能读它。数据的管道根据文件的类型分类l 字节流 FileInputStream in = new FileInputStream(f1); FileOutputStream out = new FileOutputStream(f2);l 字符流Writer out = new FileWriter(file); Reader in = new FileReader(file); 字节流l文件的拷贝 l文件夹的拷贝 l文件的下载 l文件的上传文件拷贝FileInputStream in = new FileIn
12、putStream(f1); FileOutputStream out = new FileOutputStream(f2); byte buffer = new bytelength;int ins = in.read(buffer);/读取字节到buffer中/ins = -1 时 。就已经是文件的结尾了 while ( ins != -1 ) out.write(buffer, 0, ins);/将缓存buffer中的数据写到文件中 ins = in.read(buffer); in.close(); out.flush(); out.close();文件下载protected void
13、 service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException File f1 = new File(“c:kav2009_20100523_06F09907.rar“);/表示下载的文件的类型 response.setContentType(“application/zip“);/设置中文 文件名 String fileName = “卡巴斯基.rar“; response.setHeader(“Content-Disposition“, “filen
14、ame=“ +new String(fileName.getBytes(“gb2312“),“iso8859-1“) +“ );FileInputStream in = new FileInputStream(f1); OutputStream out = response.getOutputStream(); byte buffer = new byte 1024 ;int ins = in.read(buffer);/读取字节到buffer中/ins = -1 时 。就已经是文件的结尾了 while ( ins != -1 ) out.write(buffer, 0, ins);/将缓存buffer中的数据写到文件中 ins = in.read(buffer); in.close(); out.flush(); out.close(); 比较l以上两个例子说明: 不管是文件从本地c:到本地d: 还是文件从本地c:到另一台机器的d: 都是文件的拷贝。l只要是文件产生了副本,就可以用上面的 代码。综合案例l服务器的基本原理。