首页 > 代码库 > 关于java中B/S架构

关于java中B/S架构

概述:

B/S 架构的全称为 Browser/Server,即浏览器/服务器结构。 Browser 指的是 Web 浏览器,极少数业务逻辑在前端实现,主要的业务逻辑在服务器端现,

Browser 客户端,WebApp 服务器端和 DB 构成所谓的三层架构。 B/S 架构的系统无须特别安装,只有 Web 浏览器即可。B/S 架构中,显示逻辑交给了

Web浏览器,业务处理逻辑放在了 WebApp 上,这样就避免了庞大的胖客户端,减少了客户端的压力。因为客户端包含的逻辑很少,因此也被成为瘦客户端。

优点:
1) 客户端无需安装,有 Web 浏览器即可。
2BS 架构可以直接放在广域网上,通过一定的权限控制实现多客户访
问的目的,交互性较强。
3BS 架构无需升级多个客户端,升级服务器即可。
缺点:
1) 在跨浏览器上, BS 架构不尽如人意。
2) 表现要达到 CS 架构的程度需要花费不少精力。
3) 在速度安全性上需要花费巨大的设计成本,这是 BS 架构的最大问题。

B/S架构图:

技术分享

B/S 架构的系统参与者:
第一: Web 客户端 Browser
第二: Web 服务器 Server
第三: WebApp
第四:数据库服务器
B/S 架构的系统中参与者之间的接口与协议:
第一: Web 客户端 Browser Web 服务器端 Server 之间是 W3C 制定的 HTTP 协议。
第二: Web 服务器和 Web 应用之间是 SUN 制定的 Servlet 接口。
第三: Web 应用中的小 java 程序和数据库服务器之间是 SUN 制定的 JDBC 接口。

 

技术分享

B/S架构:多线程访问服务器

BootStrap:

package com.bjpowernode.core;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;import com.bjpowernode.util.Logger;/** * 程序主入口 * @author  * @version  1.0 * @since    1.0 */public class BootStrap {	public static void main(String[] args) {       //程序入口		start();	}	private static void start() {		/**		 * 程序启动入口 		 */		Logger.log("httpserver start");		ServerSocket serverSocket = null;		Socket clientSocket = null;		BufferedReader br = null;				try {			//记录开启时间			long start = System.currentTimeMillis();			//从server.xml配置文件中获取端口号:8080			int port = ServerParser.getPort();			Logger.log("httpserver-port:" + port);			//创建服务端套接字,并且绑定端口号:8080			serverSocket = new ServerSocket(port);			//记录结束时间			long end = System.currentTimeMillis();			Logger.log("httpserver started:" + (end - start) + "ms");			while(true){				//开始监听网络,此时程序处于等待状态,等待接收				clientSocket = serverSocket.accept();				new Thread(new HandlerRequest(clientSocket)).start();							}			//接受客户端消息			/*br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));			//打印消息			String temp = null;			while((temp = br.readLine()) != null){				System.out.println(temp);			}*/								} catch (Exception e) {			// TODO Auto-generated catch block			e.printStackTrace();		} finally{			//关闭资源			if(br != null){				try {					br.close();				} catch (IOException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}			}			if(clientSocket != null){				try {					clientSocket.close();				} catch (IOException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}			}						if(serverSocket != null){				try {					serverSocket.close();				} catch (IOException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}			}							}	}}

 

 DateUtil:

package com.bjpowernode.util;import java.text.SimpleDateFormat;import java.util.Date;/** * 日期处理类 * @author  * @version    1.0 * @since      1.0 * */public class DateUtil {	private DateUtil(){			}		/**	 * 获取系统当前时间	 * @return Strinng [yyyy-MM-dd HH:mm:ss SSS]	 */	public static String getNowTime(){		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");		Date nowTime = new Date();		return dateFormat.format(nowTime);	}}

 Logger:

package com.bjpowernode.util;import java.text.SimpleDateFormat;import java.util.Date;/** * 记录日志 * @author * @version    1.0 * @since      1.0 */public class Logger {       //工具类的方法往往都是静态的,直接通过类名调用即可,不需要创建对象	   //工具类的构造方法往往是私有的,但不是必须的	private Logger(){			}	/**	 * 记录普通日志	 * @param info	 */	public static void log(String info){		/*SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");		//获取系统当前时间		Date nowTime = new Date();		String strTime = dateFormat.format(nowTime);*/		System.out.println("[INFO]" + DateUtil.getNowTime() + "" + info);			}	}

 LoggerTest:

package com.bjpowernode.util;import java.text.SimpleDateFormat;import java.util.Date;/** * 记录日志 * @author * @version    1.0 * @since      1.0 */public class Logger {       //工具类的方法往往都是静态的,直接通过类名调用即可,不需要创建对象	   //工具类的构造方法往往是私有的,但不是必须的	private Logger(){			}	/**	 * 记录普通日志	 * @param info	 */	public static void log(String info){		/*SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");		//获取系统当前时间		Date nowTime = new Date();		String strTime = dateFormat.format(nowTime);*/		System.out.println("[INFO]" + DateUtil.getNowTime() + "" + info);			}	}
package com.bjpowernode.core;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;import com.bjpowernode.util.Logger;public class HandlerRequest implements Runnable {	private Socket clientSocket;	public HandlerRequest(Socket clientSocket) {		this.clientSocket = clientSocket;	}	@Override	public void run() {		// 负责处理客户端发送的请求		BufferedReader br = null;		Logger.log("httpserver 线程Thread-Name:" + Thread.currentThread().getName());		try {			// 接受消息			br = new BufferedReader(new InputStreamReader(					clientSocket.getInputStream()));			// 打印消息			String temp = null;			while ((temp = br.readLine()) != null) {				System.out.println(temp);			}		} catch (Exception e) {			e.printStackTrace();		} finally{			//关闭资源			if(br != null){				try {					br.close();				} catch (IOException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}			}			if(clientSocket != null){				try {					clientSocket.close();				} catch (IOException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}			}		}	}}
package com.bjpowernode.core; import java.io.File;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;/** * 解析server.xml配置文件 * @author  * @version  1.0 * @since    1.0 */public class ServerParser {	public static int getPort(){		//默认值		int port = 8080;		try{		//创建解析器		SAXReader saxReader = new SAXReader();		//通过解析器的read方法将配置的文件读取到内存中去		Document document = saxReader.read(new File("conf/server.xml"));		//获取connector节点元素对象的xpath路径:/server/service/connector		//获取connector节点元素对象的xpath路径:server//connector		//获取connector节点元素对象的xpath路径://connector		Element connectorElt = (Element) document.selectSingleNode("//connector");		//获取port属性对象的值 		port = Integer.parseInt(connectorElt.attributeValue("port"));	} catch(Exception e){		e.printStackTrace();	}		return port;	}}

 

server.xml:

<?xml version="1.0" encoding="UTF-8"?><server>	<service>		<connector port="8080"></connector>	</service></server>

 所建工程:

技术分享

 运行结果:技术分享

 

关于java中B/S架构