B/S于C/S的区别
B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。B/S结构,主要是利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着Windows 98/Windows 2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构。显然B/S结构应用程序相对于传统的C/S结构应用程序将是巨大的进步。
B/S结构采用星形拓扑结构建立企业内部通信网络或利用Internet虚拟专网(VPN)。前者的特点是安全、快捷、准确。后者则具有节省投资、跨地域广的优点。须视企业规模和地理分布确定。企业内部通过防火墙接入Internet,再整个网络采用TCP/IP协议。
C/S 与 B/S 区别:
Client/Server是建立在局域网的基础上的.Browser/Server是建立在广域网的基础上的.
1.硬件环境不同:
C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.
B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行
2.对安全要求不同
C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.
B/S 建立在广域网之上, 对安全的控制能力相对弱, 面向是不可知的用户群.
3.对程序架构不同
C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.
B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.
4.软件重用不同
C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子
5.系统维护不同
系统维护是软件生存周期中,开销大, -------重要
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.
6.处理问题不同
C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统
B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.
7.用户接口不同
C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高
B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.
8.信息流不同
C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更象交易中心
C/S 结构示例代码
1
2 ///client.cpp
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <WinSock2.h>
6 #pragma comment(lib, "ws2_32.lib ")
7
8 #define PORT 5000
9 #define BUFFER 1024
10
11
12 void main()
13 {
14
15 #pragma region socket
16 WSADATA wsaData;
17 SOCKET client;
18 int port=PORT;
19 //从服务器接收的数据长度
20 int iLen;
21 //接受数据的缓冲
22 char buf[BUFFER];
23 //服务器端地址
24 struct sockaddr_in serv;
25
26
27 //接受数据缓冲区初始化
28 memset(buf,0,sizeof(buf));
29 if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
30 {
31 printf("Winsock load failed\n");
32 return;
33 }
34 //需要连接的服务器地址信息
35 serv.sin_family=AF_INET;
36
37 //需要连接的服务器端口信息
38 serv.sin_port=htons(port);
39 //将命令行的IP地址转化为二进制表示的网络字节顺序IP地址
40 serv.sin_addr.s_addr=inet_addr("127.0.0.1");
41 //建立客户端流套接字
42 client=socket(AF_INET,SOCK_STREAM,0);
43
44 if(client==INVALID_SOCKET)
45 {
46 printf("socket()failed:%d\n",WSAGetLastError());
47 return;
48 }
49 #pragma endregion socket
50
51 #pragma region connect() 请求与服务器建立TCP连接
52 if(connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET)
53 {
54 printf("connet()failed:%d\n",WSAGetLastError());
55 return;
56 }
57 #pragma endregion connect
58
59 #pragma region recv()/send()
60 else
61 {
62 //从服务器接收数据
63 iLen=recv(client,buf,sizeof(buf),0);
64 if(iLen==0)
65 return;
66 else if(iLen==SOCKET_ERROR)
67 {
68 printf("recv()failed:%d\n",WSAGetLastError());
69 return;
70 }
71 printf("recv()data from server:%s\n",buf);
72 }
73 #pragma endregion recv()/send()
74
75 #pragma region closesocket()
76 closesocket(client);
77 WSACleanup();
78
79 #pragma endregion closesocket()
80 ///4、closesocket()
81
82
83 printf("press any key to continue"); //加了这两句,不让程序退出
84
85 while(1);
86 }
1
2
3 ///server.cpp
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <WinSock2.h>
7 #pragma comment(lib, "ws2_32.lib ")
8
9 #define PORT 5000
10
11 void main()
12 {
13
14 #pragma region socket
15
16 ///1、socket
17 int port =PORT;
18 WSADATA wsaData;
19 SOCKET sListen,sAccept;
20
21 int iLen;
22 int iSend;
23
24 char buf[]="HELLO,HOW ARE YOU!";
25
26 struct sockaddr_in serv,cliet;
27
28 if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
29 {
30 printf("Winsock load failed \n");
31 return ;
32 }
33 //创建套接字
34 sListen =socket(AF_INET,SOCK_STREAM,0);
35 if (sListen ==INVALID_SOCKET)
36 {
37 printf("socket failed :%d\n",WSAGetLastError());
38 return;
39 }
40 #pragma endregion socket
41
42 #pragma region bind()
43 ///2、bind
44 //建立服务器地址
45
46 serv.sin_family =AF_INET;
47
48 serv.sin_port =htons(port);
49 serv.sin_addr.s_addr =htonl(INADDR_ANY);
50
51 if (bind(sListen,(LPSOCKADDR)&serv,sizeof(serv))==SOCKET_ERROR)
52 {
53 printf("bind()failed:%d\n",WSAGetLastError());
54 return;
55 }
56
57 #pragma endregion bind()
58
59
60 #pragma region listen()
61 ///3、listen
62
63 if (listen(sListen,5)==SOCKET_ERROR)
64 {
65 printf("listen() failed:%d\n",WSAGetLastError());
66 return;
67 }
68 #pragma endregion listen()
69
70 #pragma region accept()
71 ///4、accept
72
73 iLen =sizeof(cliet);
74 while (1)
75 {
76 sAccept =accept(sListen,(struct sockaddr *)&cliet,&iLen);
77 if (sAccept==INVALID_SOCKET)
78 {
79 printf("accept() failed:%d\n",WSAGetLastError());
80 break;
81 }
82
83 printf("accepted client IP:[%s],port:[%d]\n",inet_ntoa(cliet.sin_addr),ntohs(cliet.sin_port));
84 #pragma endregion accept()
85
86
87 ///5、阻塞、等待客户数据
88
89 #pragma region send()
90 iSend =send(sAccept,buf,sizeof(buf),0);
91 if (iSend==SOCKET_ERROR)
92 {
93 printf("send() failed:%d\n",WSAGetLastError());
94 break;
95 }
96 else if (iSend ==0)
97 {
98 break;
99 }
100 else
101 printf("send()byte:%d\n",iSend);
102 #pragma endregion send()
103
104 #pragma region closesocket()
105 closesocket(sAccept);
106 }
107 closesocket(sListen);
108 WSACleanup();
109 #pragma endregion closesocket()
110 }
111
112